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