Hibernate 4.2.8,javassist 3.18.1和ClassCastExceptions –注意您的类路径
我寫這篇文章是作為提示和警告,而不是絕對的解決方案。 我將嘗試針對我的案例(WebSphere 8.5.5)返回一種解決方法,但是我確信其他開發人員和應用程序也會受到影響。 我已經花了一些時間來找出問題的原因,所以暫時,這篇文章將有助于增加上述關鍵字的搜索索引,并鏈接到休眠問題跟蹤器。
在當前正在進行的項目中,由于Hibernate ORM 4.2.0版庫中的錯誤,我決定在安裝程序中將庫版本向前移動并升級到最新版本。 Hibernate當前以版本4.2.8作為最新的JPA 2.0兼容版本,而4.3.0是第一個正式的JPA 2.1兼容。 由于我正在開發Jee6版本,因此我選擇升級到4.2.8。
最終在4.2.8及更高版本中,庫中實現了“ 嚴重的 ”內部API更改。 Hibernate遷移到javaassist的新版本,該版本引入了一些新的內部API調用和接口。 請參閱此處的鏈接問題。 因此,版本4.2.8將作為javassist- 3.18.1-GA的依賴項獲取到您的應用程序。
最終,如果您碰巧引入了
- 對Javassist版本的多個依賴
- 一個容器通過“父級”類加載器為您的耳朵/戰爭提供了較舊的版本
然后,您將遇到類似這樣的問題。 簡而言之,如果您的容器中的活動類加載器偶然捕獲了舊版本的javassist,則在加載jpa實體或執行相關代碼時,您很可能會遇到奇怪的類強制轉換異常或“未找到類”異常指向到過時的javassist API。
恕我直言,此更改應該已經引入到Hibernate的“主要”版本中,但是我很明白,有時開發人員的需求不能由全球開發人員用戶社區的不同需求和設置來強制要求。 因此,這只是我對“應該存在”的看法,我仍然認為Hibernate是最好的Java ORM。
如果您遇到這種情況,請先采取以下措施:
- 檢查您的可部署jar依賴項,并找到Javassist的任何其他實例,尤其是較舊的版本-根據您的容器和類加載設置檢查如何加載它們。
- 如果您沒有明確包括任何額外的依賴項,并且唯一的實例是“從休眠中獲取”的實例(如我的案例),那么您需要檢查是否從應用程序或服務器級共享庫中加載了較舊版本的javassist或從應用程序服務器中的“共享”類加載器。 (我仍在為Websphere 8.5.5進行這一工作)。 您可以嘗試共享庫的加載順序或類加載模式(父??項優先/父項末次)
- 如果您找不到基于以上兩點的解決方案,或者您嘗試在應用程序上嘗試使用類加載策略,并且證明確實很麻煩,那么只需切換到版本4.2.7 ,這似乎是最后一個解決方案。向后兼容舊版本的Javassist。
如果您是JBoss EAP 6.2和JBoss Wildfly 8用戶,那么您會很安全,這意味著這些容器已經帶有“最新” javassist版本,但是您仍然需要對應用程序可能引入的任何潛在沖突版本進行分類。
希望我會為我的情況提供解決方法。
翻譯自: https://www.javacodegeeks.com/2014/01/hibernate-4-2-8-javassist-3-18-1-and-classcastexceptions-watch-out-your-classpath.html
總結
以上是生活随笔為你收集整理的Hibernate 4.2.8,javassist 3.18.1和ClassCastExceptions –注意您的类路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米推出米家加热直饮净水器 Q1000G
- 下一篇: 摆脱困境:从计划作业中调用安全方法