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
答案 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