ClassA不能强制转换为ClassA:java.lang.ClassCastException

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.

我有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.sql.OPAQUE:java.lang.ClassCastException:oracle.sql.OPAQUE不能转换为oracle.sql.OPAQUE

类加载器似乎已经加载了oracle.sql.OPAQUE两次,因此这是一个问题

  • 我已经尝试从部署描述符中删除ojdbc6,但是 然后在EAR部署本身上抛出noclassdeffounderror
  • 如果有人能告诉我如何解决这个类加载器问题, 在wildfly服务器端,这会很有帮助
  • 或者强制它从特定的方面使用类
  • 非常感谢,请提供任何可能的链接,我将非常感谢你

    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>