Frage

Ich bin ein JBoss Seam Projekt zu tun, und wenn ich ein Formular sehe ich diesen Fehler.

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

Die alway der gleiche JPA-Klasse, die auf die Form bezieht, die auf dem Bildschirm angezeigt wird, ist es nicht für mich Sinn macht, warum ist es die gleiche Klasse, wie es scheint unmöglich.

War es hilfreich?

Lösung

Dies geschieht, wenn zwei verschiedene ClassLoader Last-Objekte Klassen mit dem gleichen Namen. Die Gleichheit von zwei Klassen in Java ist abhängig von den voll qualifizierten Namen und der Klassenlader, die es geladen.

Also, wenn zwei unabhängige Klassenladebelastungsklassen von der gleichen Stelle, dann Objekte dieser Typen nicht in der Lage sein, jeden anderen Typen umgewandelt werden, auch wenn ihre Klassen die gleichen genannt werden.

Andere Tipps

Wie Joachim früher erklärt, java.lang.ClassCastException tritt normalerweise auf, wenn zwei Klassenladeprogramme, die Klassen mit dem gleichen Namen zu laden. Allerdings habe ich in einer anderen Situation kommen, wenn diese auftreten.

Dies könnte mit einigen IDE vorkommen, dass automatisch neu geladen Klassen, die geändert wurden. In solchen Fällen kann es sein, ältere Versionen der Klasse im Speicher verursacht Classcast beibehalten.

Hier sind ein paar Möglichkeiten, wie Sie dieses Problem beheben könnten:

  1. Wenn Sie eine benutzerdefinierte Class Loader schreiben, während eine Klasse stellen Sie sicher, dass der Laden base / default Class Loader nicht bereits eine Instanz dieser Klasse geladen.

  2. Machen Sie die Klasse Wesen eine Unterklasse der Klasse geladen, die bereits von den Standard-Class-Loader geladen wird.

  3. Machen Sie die Klasse, die geladen eine Schnittstelle implementieren, die bereits von den Standard-Class-Loader geladen wird.

Mehr Infos hier - http://www.jspwiki.org/wiki/A2AClassCastException

Das ist, weil die Klasse wird von zwei verschiedenen Classloader geladen wurde. Sie können zwischen ihnen nicht werfen.

Sie haben eine Kopie von CsiTipoLav in Ihrer Anwendung wahrscheinlich bekommen, und die zwei verschiedenen Kopien zu unterschiedlichen Zeiten aus verschiedenen Classloader geladen werden. JBoss hat eine Fülle von verschiedenen Classloader in einer Hierarchie, und es ist leicht, die Dinge in einem Twist zu erhalten.

Achten Sie darauf, nur Sie haben eine der Klasse kopieren.

Das Objekt, das Sie Guss versuchen, von einem anderen Klassenlader als die geladen wird, die die Klasse geladen hat Sie zu Guss in versuchen.

In meinem Fall hatte ich zwei verschiedene * .ear und wollte eine Klasse von dem anderen laden. So hatte ich die Klassenlader zu isolieren. Ich habe diese Beschreibung:

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

Es funktionierte für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top