ClassCastException:无法在JBoss 7.1.1.Final中将oracle.sql.ARRAY转换为oracle.sql.ARRAY

时间:2014-11-04 12:21:35

标签: spring oracle oracle11g jboss7.x classloader

DemoApp是在jboss 7.1.1.Final中部署的spring集成项目

从存储过程返回的结果包含oracle.sql.ARRAY对象(对象引用jboss模块的ojdbc jar)

我尝试转换为抛出异常的oracle.sql.ARRAY

代码:

URL resultJarLocation= resultMap.get("returnObj").getClass().getProtectionDomain().getCodeSource().getLocation();
URL appJarLocation = oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println("resultJarLocation : " + resultJarLocation);
System.out.println("appJarLocation : " + appJarLocation);

oracle.sql.ARRAY returnObj=(oracle.sql.ARRAY)resultMap.get("returnObj");

例外:

org.springframework.messaging.MessageHandlingException: java.lang.ClassCastException: oracle.sql.ARRAY  cannot be cast to oracle.sql.ARRAY

应用程序ARRAY类在已部署的应用程序中引用ojdbc jar。 结果集ARRAY类引用ojdbc jar jboss模块 系统输出:

resultJarLocation : jar:file:/<JBOSS_HOME>/modules/com/oracle/ojdbc6/main/ojdbc6.jar
appJarLocation : vfs:/<JBOSS_HOME>/bin/content/DemoApp.war/WEB-INF/lib/ojdbc6.jar

2 个答案:

答案 0 :(得分:0)

您正在尝试在不同类加载器加载的类之间进行转换。 JVM不仅通过名称和包来区分类,还通过使用的类加载器来区分类。换句话说,从JVM的角度来看就像试图从String转换为Long;你不能。 您唯一能想到的就是配置。设置要使用的同一个类加载器,或者将类加载器设置在同一层次结构中,以利用委派。

我对JBoss(尤其是当前版本)不是很熟悉,但我知道它已经(或过去曾经有过)一些与其他应用服务器非常不同的类加载策略。检查有关类加载的文档将是我的第一个选择。

答案 1 :(得分:0)

我通过将ojdbc jar的范围更改为“提供”来解决了这个问题,因为这不包括WEB-INF / lib中的jar。

然后在pom中添加了jboss 7模块'com.oracle.ojdbc6'的Dependencic。这将在META-INF / MANIFEST.MF文件中添加Dependencies属性,因此在部署时jboss 7的ojdbc jar将会用于jboss和应用程序的对象创建,类加载器将是jboss的类加载器。

Bellow是pom中的代码。

1)清单条目:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <archive>
            <manifestEntries>
                <Dependencies>com.oracle.ojdbc6</Dependencies>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

2)提供的依赖性:

<dependency>
    <scope>provided</scope>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.2.0</version>
</dependency>

将使用依赖项

生成META-INF / Manifest.MF文件
Manifest-Version: 1.0
Dependencies: com.oracle.ojdbc6
Built-By: Mrinmoy
Build-Jdk: 1.7.0_65
Created-By: Apache Maven 3.2.2
Archiver-Version: Plexus Archiver