両方のクラスがまったく同じである場合にクラス キャスト例外を取得する

StackOverflow https://stackoverflow.com/questions/2371967

  •  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 が発生する可能性があります。

この問題を解決するには、次のような方法があります。

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

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

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

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

このクラスは、2つの異なるクラスローダによってロードされているため、

このです。あなたはそれらの間でキャストすることはできません。

あなたはおそらく、あなたのアプリケーションにCsiTipoLavの複製コピーを持っているし、2つの異なるコピーを異なるクラスローダから異なる時間にロードされています。 JBossは、階層内の異なるクラスローダーの茄多を持っており、それがねじれで物事を取得するのは簡単です。

を確認してくださいだけのクラスの一つのコピーを持っています。

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

私の場合は、二つの異なる*の.earを持っていたし、他のクラスをロードしたかったです。 だから私は、クラスローダを分離しなければなりませんでした。私はこの記述を使用します:

http://www.thorgull.be/wiki/index.php?タイトル= ClassLoader_isolation_in_JBOSSする

これは私のために働いています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top