両方のクラスがまったく同じである場合にクラス キャスト例外を取得する
-
24-09-2019 - |
質問
JBoss SEAM プロジェクトを実行しているのですが、フォームを表示するとこのエラーが発生します。
java.lang.ClassCastException:
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav cannot be cast to
it.cogitoweb.csi.entity.csiorelav.CsiTipoLav
画面に表示されているフォームに関連するのは常に同じ JPA クラスですが、なぜ同じクラスなのか理解できません。不可能のようです。
解決
ClassLoader
は、同じ名前を持つ負荷クラスオブジェクト際にこれが起こります。 Javaで二つのクラスの平等は完全修飾名に依存してのとのそれをロードしたクラスローダます。
だから、二つの独立したクラスローダが同じ場所からクラスをロードした場合、それらの型のオブジェクト自分のクラスが同じと呼ばれていても、お互いの型にキャストすることはできません。
他のヒント
Joachim が前に説明したように、java.lang.ClassCastException は通常、2 つのクラスローダーが同じ名前のクラスをロードするときに発生します。ただし、これが発生する可能性のある別の状況に遭遇しました。
これは、変更されたクラスを自動的に再ロードする一部の IDE で発生する可能性があります。このような場合、古いバージョンのクラスがメモリ内に保持され、ClassCastException が発生する可能性があります。
この問題を解決するには、次のような方法があります。
カスタム クラス ローダーを作成している場合は、クラスをロードするときに、基本/デフォルト クラス ローダーにそのクラスのインスタンスがまだロードされていないことを確認してください。
ロードされるクラスを、デフォルトのクラスローダーによってすでにロードされているクラスのサブクラスにします。
ロードされるクラスに、デフォルトのクラスローダーによってすでにロードされているインターフェイスを実装させます。
このです。あなたはそれらの間でキャストすることはできません。
あなたはおそらく、あなたのアプリケーションにCsiTipoLav
の複製コピーを持っているし、2つの異なるコピーを異なるクラスローダから異なる時間にロードされています。 JBossは、階層内の異なるクラスローダーの茄多を持っており、それがねじれで物事を取得するのは簡単です。
を確認してくださいだけのクラスの一つのコピーを持っています。
あなたがキャストしようとしているオブジェクトは、あなたにキャストしようとしているクラスをロードしたものとは異なるクラスローダによってロードされます。
私の場合は、二つの異なる*の.earを持っていたし、他のクラスをロードしたかったです。 だから私は、クラスローダを分離しなければなりませんでした。私はこの記述を使用します:
http://www.thorgull.be/wiki/index.php?タイトル= ClassLoader_isolation_in_JBOSSする
これは私のために働いています。