4

JBoss EAP 6.1 独立服务器

部署为 war 文件的应用程序引发运行时异常

java.lang.ClassCastException: oracle.sql.ARRAY cannot be cast to oracle.sql.ARRAY

在线

oracle.sql.ARRAY obj = (oracle.sql.ARRAY) rs.getObject("RATINGOBJ");

包含的 JDBC 库是 ojdbc6.jar (WEB_INF/lib)。所有库都包含在 war 文件中,并且服务器上没有设置“全局”库。我已验证应用程序中的任何位置均未包含其他 jdbc 库。

为了创建 JDBC 数据源,我为 ojdbc6.jar 创建了部署。这是我能想到的唯一可能的冲突来源。当我从 war 文件中删除 ojdbc6.jar 时,我得到一个 ClassNotFound 异常来代替 ClassCastException。

该应用程序的所有其他部分都可以正常工作,除了这一行。我该如何进一步调试呢?

4

2 回答 2

4

我不确定为什么从 web-inf/lib 加载不起作用。很可能类加载器是不同的。

执行前两个步骤进行诊断。之后尝试以下两种替代方法之一来解决问题。1)通过比较和
检查类加载器是否相同, 如果你在两个类加载器之间这样做,它应该返回false,因为它看起来类加载器不同。投射到同一类时检查 ClassCastException 的解释 rs.getObject().getClass('RATINGOBJ').getClassLoader()oracle.sql.ARRAY.class.getClassLoader()equals

这个问题早先已经在另一个论坛https://forums.oracle.com/message/9330314中报告过。在 jboss 中移动 jars 仍然会导致同样的问题。

2)找出加载类的源jar并删除不需要的jar。通过检查找到两个不同类的 jar
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation() oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation() -确定一个类来自哪个 JAR 文件

可能的解决方案:

a)如果你需要两个罐子,你必须移动罐子 rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()

并按照http://www.javaworld.com/community/node/8184中的说明创建模块。

b) 如果您仍然无法按预期加载类,请在 jboss 服务器库中指定库。

c) 强制从特定 jar 加载类的最后一个解决方案是在 bootclasspath 中指定 jar。

于 2013-06-16T05:46:48.083 回答
3

WEB-INF/lib 级别不应有任何 JDBC 驱动程序 JAR。Java EE 应用服务器需要它们处于应用服务器级别。

将它移动到默认服务器 /lib 目录中,看看是否更好。

于 2013-06-15T00:54:06.490 回答