如果上述所有措施均無濟(jì)于事,請嘗試將問題隔離在一個簡單的、可重現(xiàn)的測試案例中,然后聯(lián)系 BEA 技術(shù)支持部門,以做進(jìn)一步探查。
已知的 WebLogic Server 問題
以下匯集了可導(dǎo)致 ClassCastException 錯誤的各種情況,您在使用各種 WebLogic 子系統(tǒng)時可能會遇到這些情況。
小程序
有關(guān)該情況的完整說明,請參考 http://e-docs.bea.com/wls/docs81/applets/usingapplets.html (English)
摘要:如果小程序中的 WebLogic Server 客戶端嘗試從 ClassLoader 獲取某些資源信息,且一并使用了緩存標(biāo)志和 codebase=/bea_wls_internal/classes
標(biāo)志,就可能會拋出 ClassCastException
。
解決方法:
- 在將類路徑 servlet 用作代碼基時,請不要使用“cache_option”和“cache_archive”一類的緩存選項(xiàng)。
- 使用緩存選項(xiàng)時,請不要使用 /classes (ClasspathServlet) 做為代碼基。如果要這樣做,請先使用歸檔實(shí)用程序打包客戶端 JAR。
有關(guān)此限制的詳細(xì)信息,請參閱 http://developer.java.sun.com/developer/bugParade/bugs/4648591.html (English)。
JCA Connector
有關(guān)該情況的完整說明,請參考 http://e-docs.bea.com/wls/docs81/notes/issues.html (English)。
摘要:發(fā)出連接請求時,WebLogic Server 會返回一個代理對象,該對象通過資源適配器將連接對象封裝后返回到客戶端。WebLogic Server 使用該代理來提供一些功能,幫助應(yīng)用程序使用 WebLogic Server 的“J2EE 連接器體系結(jié)構(gòu)”實(shí)現(xiàn)。這些功能包括 (1) 連接泄漏檢測功能和 (2) 連接請求在啟動使用該連接的全局事務(wù)之前發(fā)出時,推遲 XAResource 登記。
如果將連接請求返回的連接對象向原始的 Connection
類進(jìn)行了轉(zhuǎn)換,就可能發(fā)生 ClassCastException
。導(dǎo)致該異常的對象不外乎在連接請求過程中:(1) 資源適配器進(jìn)行轉(zhuǎn)換時或 (2) 客戶端進(jìn)行轉(zhuǎn)換時。
在 WebLogic Server 8.1 SP2 中,嘗試檢測由上述資源適配器情況 (1) 導(dǎo)致的 ClassCastException
。如果服務(wù)器檢測到該轉(zhuǎn)換失敗,將關(guān)閉代理包裝器功能,并在連接請求期間返回連接對象(不進(jìn)行包裝)。服務(wù)器會記錄一條警告消息,說明代理包裝器已被關(guān)閉。出現(xiàn)此類轉(zhuǎn)換故障時,連接泄漏檢測和 XAResource 推遲登記功能也將被關(guān)閉(但當(dāng)前在控制臺監(jiān)視中并不會就此給出任何指示)。
WebLogic Server 嘗試以使用容器管理的安全性的客戶端身份檢測 ClassCastException
。如果要這樣做,則部署的資源適配器須定義安全性 Credential。
如果客戶端在執(zhí)行轉(zhuǎn)換時發(fā)生 ClassCastException
,可按如下方式修改客戶(客戶端)代碼:
解決方法:如果客戶端將連接對象轉(zhuǎn)換為 MyConnection
,而不是將 MyConnection
作為實(shí)現(xiàn)資源適配器的 Connection
接口的一個類,請將該對象修改為一個擴(kuò)展 Connection
的接口。實(shí)現(xiàn)一個用于實(shí)現(xiàn) MyConnection
接口的 MyConnectionImpl
類。
Servlet 動態(tài)重新加載
有關(guān)該情況的完整說明,請參考 http://e-docs.bea.com/wls/docs81/jsp/reference.html (English)
摘要:要在會話過程中動態(tài)重新加載 servlet 或 JSP,servlet 會話中存儲的對象必須是可序列化的。需要進(jìn)行序列化是因?yàn)椋瑂ervlet 是使用新的 ClassLoader 重新加載的,而這會導(dǎo)致此前加載的所有類(舊版本 servlet 中的類)與使用新的 ClassLoader 加載的所有類(新版本 servlet 類)發(fā)生不兼容的情況。這種不兼容會導(dǎo)致 servlet 返回 ClassCastException 錯誤。
使用 Prefer-web-inf-classes 功能
有關(guān)該情況的完整說明,請參考 http://e-docs.bea.com/wls/docs81/programming/classloading.html (English)
摘要:weblogic.xml Web 應(yīng)用程序部署描述符包含一個 prefer-web-inf-classes 元素(container-descriptor 元素的子元素)。缺省情況下,此元素設(shè)置為 False。如果將此元素設(shè)置為 True,則不遵循 ClassLoader 委托模型,從而使 Web 應(yīng)用程序中的類定義的加載順序優(yōu)先于更高級別的 ClassLoader 中的類定義。這樣 Web 應(yīng)用程序就可使用其自己版本的第三方類,該類也可能是 WebLogic Server 的一部分。請參閱 weblogic.xml Deployment Descriptor Elements (English)。
使用該功能時,必須注意不要混淆使用 Web 應(yīng)用程序的類定義創(chuàng)建的實(shí)例與使用服務(wù)器的定義創(chuàng)建的實(shí)例。如果混淆了此類實(shí)例,就會發(fā)生 ClassCastException。
群集:在 http 會話中存儲包含 EJBObject 的自定義對象 - CR102119
摘要:可序列化的自定義對象會包裝 EJBObject(對 EJB 的引用)。該自定義對象存儲在 http 會話中。會話復(fù)制時,這種設(shè)計(jì)就會導(dǎo)致 ClassCastException。
解決方法:在以后版本的 WebLogic Server 中將徹底解決該問題。目前的解決辦法是在包裝器內(nèi)存儲 EJB 句柄(而不是 EJBObject)。群集:Failover 后使用 http 會話中的 EJB 句柄 - CR187062
摘要:在群集中分別部署 webApp 和 EJB。EJB 句柄