ClassA不能强制转换为ClassA:java.lang.ClassCastException
我有Ejb webservice项目和其他web项目,我正在通过Wildfly 10.x服务器上的EAR进行部署, war项目和Ejb项目需要oracle.sql.OPAQUE通过xdb JAR创建xml数据, 对于oracle.sql.OPAQUE,我在项目构建路径中添加了ojdbc6,并将其添加到部署描述符中, 我还在wildfly模块中添加了用于jdbc连接的ojdbc6驱动程序。 在部署项目时,没有错误,正如运行页面时一样,我得到ClassA不能强制转换为ClassA:java.lang.ClassCastException,java,jboss,wildfly-10,ojdbc,Java,Jboss,Wildfly 10,Ojdbc,我有Ejb webservice项目和其他web项目,我正在通过Wildfly 10.x服务器上的EAR进行部署, war项目和Ejb项目需要oracle.sql.OPAQUE通过xdb JAR创建xml数据, 对于oracle.sql.OPAQUE,我在项目构建路径中添加了ojdbc6,并将其添加到部署描述符中, 我还在wildfly模块中添加了用于jdbc连接的ojdbc6驱动程序。 在部署项目时,没有错误,正如运行页面时一样,我得到oracle.sql.OPAQUE不能转换为oracle.
oracle.sql.OPAQUE不能转换为oracle.sql.OPAQUE:java.lang.ClassCastException:oracle.sql.OPAQUE不能转换为oracle.sql.OPAQUE
类加载器似乎已经加载了oracle.sql.OPAQUE两次,因此这是一个问题
10:24:39,460 INFO [icrCommon] (default task-8) ++++ QueryRequest queryXMLAccess() - ContextKey:256574422:190508:210142844 TypeId: 0 Channel: CAP
10:24:40,521 SEVERE [com.sun.xml.ws.server.sei.EndpointMethodHandler] (default task-8) oracle.sql.OPAQUE cannot be cast to oracle.sql.OPAQUE: java.lang.ClassCastException: oracle.sql.OPAQUE cannot be cast to oracle.sql.OPAQUE
at com.att.icr.dataAccess.ICRDatabaseAccess.IcrActiveHistoryXMLQuery(ICRDatabaseAccess.java:2093)
at com.att.icr.icrservices.datamapping.ICRDataAccess.queryXMLAccess(ICRDataAccess.java:1161)
at com.att.icr.icrservices.ICRSoapHttpBindingImpl.queryICR(ICRSoapHttpBindingImpl.java:307)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
此问题与Wildfly中的类加载问题相关。正如您所知,Wildfly有一个模块化的类加载结构。每个模块都有自己的类加载器。仅仅类类型相同是不够的。在类装入器中必须相同。在: WildFly的类加载基于必须定义对其他模块的显式依赖关系的模块。WildFly中的部署也是模块,并且不能访问应用服务器中JAR中定义的类,除非定义了对这些类的显式依赖关系 您可以创建自定义模块并在此模块中提供.ears加载jar。在$JBOSS_HOME/modules/com/example/main/中创建module.xml文件,将要加载到module.xml中的jar名称写入 在.ears中创建部署描述符(jboss deployment structure.xml),并将模块添加到此文件中
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<dependencies>
<module name="com.example" export="true" />
</dependencies>
</deployment>
</jboss-deployment-structure>
因此,Jar的类装入器是相同的。你可以调查一下,情况会变得更糟。。即使包名相同,MyF飞类加载器也不会在同一个EAR文件中的2个不同的JAR中考虑2个类。在将大型应用程序从JBoss移植到Wildfly时,我们遇到了很多麻烦,最终不得不将大量的包私有类和成员公开,这是最快的修复方法。在将jboss5迁移到Wildfly时,我遇到了同样的问题(对于Mysql)。我用这个解决方案解决了这个问题。当然,删除ear的WEN-INF/lib中的相关jar。
+-----com
+-----example
+-----main
module.xml
sample.jar
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<dependencies>
<module name="com.example" export="true" />
</dependencies>
</deployment>
</jboss-deployment-structure>