Erste Klasse Guss Ausnahme, wo beide Klassen sind genau die gleichen
-
24-09-2019 - |
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.
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:
-
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.
-
Machen Sie die Klasse Wesen eine Unterklasse der Klasse geladen, die bereits von den Standard-Class-Loader geladen wird.
-
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.