如果上述所有措施均无济于事,请尝试将问题隔离在一个简单的、可重现的测试案例中,然后联系 BEA 技术支持部门,以做进一步探查。
已知的 WebLogic Server 问题
以下汇集了可导致 ClassCastException 错误的各种情况,您在使用各种 WebLogic 子系统时可能会遇到这些情况。
小程序
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/applets/usingapplets.html (English)
摘要:如果小程序中的 WebLogic Server 客户端尝试从 ClassLoader 获取某些资源信息,且一并使用了缓存标志和 codebase=/bea_wls_internal/classes
标志,就可能会抛出 ClassCastException
。
解决方法:
- 在将类路径 servlet 用作代码基时,请不要使用“cache_option”和“cache_archive”一类的缓存选项。
- 使用缓存选项时,请不要使用 /classes (ClasspathServlet) 做为代码基。如果要这样做,请先使用归档实用程序打包客户端 JAR。
有关此限制的详细信息,请参阅 http://developer.java.sun.com/developer/bugParade/bugs/4648591.html (English)。
JCA Connector
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/notes/issues.html (English)。
摘要:发出连接请求时,WebLogic Server 会返回一个代理对象,该对象通过资源适配器将连接对象封装后返回到客户端。WebLogic Server 使用该代理来提供一些功能,帮助应用程序使用 WebLogic Server 的“J2EE 连接器体系结构”实现。这些功能包括 (1) 连接泄漏检测功能和 (2) 连接请求在启动使用该连接的全局事务之前发出时,推迟 XAResource 登记。
如果将连接请求返回的连接对象向原始的 Connection
类进行了转换,就可能发生 ClassCastException
。导致该异常的对象不外乎在连接请求过程中:(1) 资源适配器进行转换时或 (2) 客户端进行转换时。
在 WebLogic Server 8.1 SP2 中,尝试检测由上述资源适配器情况 (1) 导致的 ClassCastException
。如果服务器检测到该转换失败,将关闭代理包装器功能,并在连接请求期间返回连接对象(不进行包装)。服务器会记录一条警告消息,说明代理包装器已被关闭。出现此类转换故障时,连接泄漏检测和 XAResource 推迟登记功能也将被关闭(但当前在控制台监视中并不会就此给出任何指示)。
WebLogic Server 尝试以使用容器管理的安全性的客户端身份检测 ClassCastException
。如果要这样做,则部署的资源适配器须定义安全性 Credential。
如果客户端在执行转换时发生 ClassCastException
,可按如下方式修改客户(客户端)代码:
解决方法:如果客户端将连接对象转换为 MyConnection
,而不是将 MyConnection
作为实现资源适配器的 Connection
接口的一个类,请将该对象修改为一个扩展 Connection
的接口。实现一个用于实现 MyConnection
接口的 MyConnectionImpl
类。
Servlet 动态重新加载
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/jsp/reference.html (English)
摘要:要在会话过程中动态重新加载 servlet 或 JSP,servlet 会话中存储的对象必须是可序列化的。需要进行序列化是因为,servlet 是使用新的 ClassLoader 重新加载的,而这会导致此前加载的所有类(旧版本 servlet 中的类)与使用新的 ClassLoader 加载的所有类(新版本 servlet 类)发生不兼容的情况。这种不兼容会导致 servlet 返回 ClassCastException 错误。
使用 Prefer-web-inf-classes 功能
有关该情况的完整说明,请参考 http://e-docs.bea.com/wls/docs81/programming/classloading.html (English)
摘要:weblogic.xml Web 应用程序部署描述符包含一个 prefer-web-inf-classes 元素(container-descriptor 元素的子元素)。缺省情况下,此元素设置为 False。如果将此元素设置为 True,则不遵循 ClassLoader 委托模型,从而使 Web 应用程序中的类定义的加载顺序优先于更高级别的 ClassLoader 中的类定义。这样 Web 应用程序就可使用其自己版本的第三方类,该类也可能是 WebLogic Server 的一部分。请参阅 weblogic.xml Deployment Descriptor Elements (English)。
使用该功能时,必须注意不要混淆使用 Web 应用程序的类定义创建的实例与使用服务器的定义创建的实例。如果混淆了此类实例,就会发生 ClassCastException。
群集:在 http 会话中存储包含 EJBObject 的自定义对象 - CR102119
摘要:可序列化的自定义对象会包装 EJBObject(对 EJB 的引用)。该自定义对象存储在 http 会话中。会话复制时,这种设计就会导致 ClassCastException。
解决方法:在以后版本的 WebLogic Server 中将彻底解决该问题。目前的解决办法是在包装器内存储 EJB 句柄(而不是 EJBObject)。群集:Failover 后使用 http 会话中的 EJB 句柄 - CR187062
摘要:在群集中分别部署 webApp 和 EJB。EJB 句柄