2016-08-01 36 views
1

Websphere 8.0.0.11

Hibernate 4.2.21.Final

Ich habe viele Fragen über das gleiche Problem gefunden, aber keiner von ihnen hat für mich funktioniert.

Wenn ich die Anwendung in Websphere bereitstellen, funktioniert es OK.

Allerdings haben wir eine gemeinsame Bibliothek definiert, die alle Bibliotheken von Drittanbietern enthält (Spring, Hibernate, Javassist, usw.), so dass unsere WARs dünner sind.

Auf diese Weise verknüpfen wir während der Bereitstellung unsere Thin WAR mit dieser gemeinsam genutzten Websphere-Bibliothek.

Der Punkt ist, dass wenn wir die Anwendung auf diese Weise die ClassCastException Hibernate exception _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy geworfen wird.

Ich habe die geladenen Gläser in der Websphere-Konsole überprüft und kann nur einen Java-Jar (3.18.1-GA) im Klassenpfad sehen.

Warum konnte das passieren?

UPDATE

Ich habe auch versucht PARENT_FIRST und PARENT_LAST Laden von Klassen verwenden.

UPDATE 2

Ich habe gerade herausgefunden, dass Websphere sein eigenen Javassist Glas wird geladen:

URL location = ProxyFactory.class.getProtectionDomain().getCodeSource().getLocation(); 
logger.info("{}", location); 

Er druckt: file:/opt/IBM/WebSphere/AppServer/plugins/javassist.jar

Antwort

1

Nachdem ich so ziemlich alles versucht habe, fand ich auf S.O. ohne Erfolg entschied ich mich zu Downgrade Hibernate auf Version 4.1.12.Final. Dies ist die Version 4.x, die mit Websphere 8.x kompatibel ist.

0

Das Problem ist, dass Javassist Spuren in seinem erzeugten Blättern Code. Wenn Javaassist zweimal auf dem Klassenpfad steht, werden seine Klassen zweimal geladen. Zwei Typen sind jedoch nur dann gleich, wenn sie den gleichen Namen haben und werden vom selben Klassenlader geladen. In Ihrem Fall löst die generierte Klasse ihre JavaSist-Abhängigkeit in einen Typ, der vom Anwendungsklassenlader geladen wird, während der Code die Instanz in den JavaSpist-Typ umwandelt, der vom Websphere-Klassenladeprogramm geladen wird (oder umgekehrt).

Teilen Sie irgendwelche Abhängigkeiten zwischen Anwendungen Hibernate? Versuchen Sie, in Ihrer Anwendung keine gemeinsam genutzten Bibliotheken für Hibernate zu verwenden, um dies zu vermeiden.

+0

Hallo Rafael, danke fürs Antworten. Ja, wir teilen eine Anzahl von Bibliotheken, die in einer Websphere-Bibliothek definiert sind, um unsere schweren Kriege zu erleichtern. Bisher hatten wir Spring 4.x + Hibernate 3.6, und alles läuft reibungslos. Websphere's Javaassist muss mit dem in unserer Shared Library kompatibel sein. Leider scheint es keine gute Lösung dafür zu geben ... – codependent

+0

Was Sie tun können, ist, dass Sie Ihre Abhängigkeit schattieren können, um sie in einem anderen Namensraum zu platzieren. –