25

JBoss SEAMプロジェクトを実行していますが、フォームを表示するとこのエラーが発生します。

java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav

画面に表示されるフォームに関連するJPAクラスは常に同じですが、なぜ同じクラスなのかはわかりません。不可能に思えます。

4

5 に答える 5

40

これは、2つの異なるClassLoaderオブジェクトが同じ名前のクラスをロードするときに発生します。Javaでの2つのクラスの同等性は、完全修飾名とそれをロードしたクラスローダーに依存します。

したがって、2つの独立したクラスローダーが同じ場所からクラスをロードする場合、それらのクラスが同じと呼ばれていても、それらのタイプのオブジェクトを互いにキャストすることはできません。

于 2010-03-03T14:22:28.573 に答える
8

Joachimが前に説明したように、java.lang.ClassCastExceptionは通常、2つのクラスローダーが同じ名前のクラスをロードするときに発生します。しかし、これが発生する可能性があるときに別の状況に遭遇しました。

これは、変更されたクラスを自動的に再ロードする一部のIDEで発生する可能性があります。このような場合、ClassCastExceptionの原因となる古いバージョンのクラスがメモリに保持されている可能性があります。

この問題を解決する方法はいくつかあります。

  1. カスタムクラスローダーを作成している場合は、クラスのロード中に、ベース/デフォルトのクラスローダーにそのクラスのインスタンスがロードされていないことを確認してください。

  2. ロードされるクラスを、デフォルトのクラスローダーによってすでにロードされているクラスのサブクラスにします。

  3. ロードされるクラスに、デフォルトのクラスローダーによってすでにロードされているインターフェースを実装させます。

詳細はこちら-http ://www.jspwiki.org/wiki/A2AClassCastException

于 2011-09-27T10:24:56.307 に答える
5

これは、クラスが2つの異なるクラスローダーによってロードされているためです。それらの間でキャストすることはできません。

アプリケーションにの重複コピーがある可能性がCsiTipoLavあり、2つの異なるコピーが異なるクラスローダーから異なる時間にロードされています。JBossには階層内に多数の異なるクラスローダーがあり、ひねりを加えるのは簡単です。

クラスのコピーが1つしかないことを確認してください。

于 2010-03-03T14:22:22.450 に答える
2

キャストしようとしているオブジェクトは、キャストしようとしているクラスをロードしたクラスローダーとは異なるクラスローダーによってロードされます。

于 2010-03-03T14:22:22.940 に答える
2

私の場合、2つの異なる* .earがあり、他のクラスからクラスをロードしたいと思いました。そのため、クラスローダーを分離する必要がありました。私はこの説明を使用しました:

http://www.thorgull.be/wiki/index.php?title=ClassLoader_isolation_in_JBOSS

それは私のために働いた。

于 2013-08-30T09:07:34.193 に答える