2016-08-01 81 views
1

的Websphere 8.0.0.11

休眠4.2.21.Final

時javassist_856不能轉換爲javassist.util.proxy.Proxy

我發現了許多關於這個問題的問題,但他們都沒有爲我工作。

如果我在Websphere中部署應用程序,它可以正常工作。

然而,我們已經定義了一個共享庫,其中包含所有第三方庫(spring,hibernate,javassist等),以便我們的WAR更薄。

這種方式在部署過程中將我們的瘦WAR與該Websphere共享庫相關聯。

問題是,當我們以這種方式部署應用程序時,會拋出ClassCastException Hibernate exception _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy

我已經檢查了websphere控制檯中的加載jar,並且只能在類路徑中看到一個javassist jar(3.18.1-GA)。

爲什麼會發生這種情況?

UPDATE

我也用PARENT_FIRST和PARENT_LAST類加載嘗試。

更新2

我只是發現了WebSphere加載自己的了Javassist的jar:

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

它打印:file:/opt/IBM/WebSphere/AppServer/plugins/javassist.jar

回答

1

嘗試了我在S.O.上找到的幾乎所有東西之後。沒有任何成功,我決定將降級到Hibernate 4.1.12.Final。這是與Websphere 8.x兼容的最大4.x版本。

0

的問題是,Javassist是葉子在其產生的痕跡碼。使用Javassist兩次在類路徑上,它的類會被加載兩次。但是,如果兩個類型具有相同的名稱,則只有相同的類型由同一個類加載器加載。在你的情況下,當你的代碼將實例轉換爲由Websphere類加載器加載的Javassist類型(或其他方式)時,生成的類將其Javassist依賴關係解析爲由應用程序類加載器加載的類型。

您是否在應用程序之間共享任何Hibernate依賴關係?儘量不要在應用程序中使用任何與Hibernate相關的共享庫來避免這種情況。

+0

嗨拉斐爾,謝謝你的回答。是的,我們正在共享一些在websphere共享庫中定義的庫,以減輕我們的激烈戰爭。到目前爲止,我們已經有Spring 4.x + Hibernate 3.6,並且一切運行順利。 Websphere的Javassist必須與共享庫中的兼容。不幸的是,這似乎沒有一個好的解決方案... – codependent

+0

你可以做的是,你可以遮蔽你的依賴關係,把它放在不同的命名空間。 –