Question

Je suis en train de faire un projet JBoss Seam et quand je vois une forme que je reçois cette erreur.

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

Son alway la même classe JPA qui est liée à la forme qui est affiché à l'écran, il ne me fait pas sens pourquoi est-il de la même classe, il semble impossible.

Était-ce utile?

La solution

Cela se produit lorsque deux objets ClassLoader différentes classes de charge avec le même nom. L'égalité de deux classes en Java dépend du nom complet et le chargeur de classe qui l'a chargé.

Donc, si deux chargeurs de classe indépendants se chargent des classes au même endroit, les objets de ces types ne seront pas en mesure d'être jeté à chaque type d'autres, même si leurs classes sont appelées les mêmes.

Autres conseils

Comme expliqué précédemment Joachim, java.lang.ClassCastException se produit généralement lorsque deux classloaders chargent les classes avec le même nom. Cependant, je suis venu dans une autre situation où cela pourrait se produire.

Cela pourrait se produire avec certains IDE qui rechargent automatiquement les classes qui ont été modifiés. Dans ce cas, il pourrait y avoir des versions plus anciennes de la classe conservée en mémoire provoquant ClassCastException.

Voici quelques façons dont vous pouvez résoudre ce problème:

  1. Si vous écrivez un chargeur de classe personnalisée, tout en chargeant une classe assurez-vous que la classe de base / default chargeur ne possède pas déjà une instance de cette classe chargée.

  2. Faire la classe en cours de chargement d'une sous-classe de la classe qui est déjà chargé par le chargeur de classe par défaut.

  3. Faire la classe en cours de chargement implémenter une interface qui est déjà chargé par le chargeur de classe par défaut.

Plus d'infos ici - http://www.jspwiki.org/wiki/A2AClassCastException

En effet, la classe a été chargé par deux classloaders différentes. Vous ne pouvez pas lancer entre eux.

Vous avez probablement obtenu une copie de CsiTipoLav dans votre application, et les deux copies différentes sont chargées à différents moments de différents classloaders. JBoss a une pléthore de différents classloaders dans une hiérarchie, et il est facile de faire avancer les choses dans une torsion.

Assurez-vous que vous ne disposez que d'une copie de la classe.

L'objet que vous essayez de lancer, est chargé par un autre classloader que celui qui a chargé la classe que vous essayez de jeter dans.

Dans mon cas, j'avais deux différents * .ear et voulait charger une classe de l'autre. Donc, je devais isoler le classloader. J'ai utilisé cette description:

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

Il a travaillé pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top