Java 尝试调用CXF/SOAP Web服务时发生LinkageError

Java 尝试调用CXF/SOAP Web服务时发生LinkageError,java,soap,cxf,jboss6.x,linkageerror,Java,Soap,Cxf,Jboss6.x,Linkageerror,我有一个项目(比如说myproject),我在其中托管了一个CXF RESTful服务和CXF WS/SOAP服务,并在JBoss(6.0.0.FINAL)上运行。RESTful接口被我们所有的内部系统使用,SOAP接口被第三方系统使用(作为回调接口) 以下URL工作正常 RESTURL:http://localhost:8080/myproject/internal/someOperation(内容类型:application/json和POST body) soapwsdl:http://

我有一个项目(比如说myproject),我在其中托管了一个CXF RESTful服务和CXF WS/SOAP服务,并在JBoss(6.0.0.FINAL)上运行。RESTful接口被我们所有的内部系统使用,SOAP接口被第三方系统使用(作为回调接口)

以下URL工作正常

  • RESTURL:
    http://localhost:8080/myproject/internal/someOperation
    内容类型:application/json
    和POST body)

  • soapwsdl:
    http://localhost:8080/myproject/cbsoap?wsdl

现在我的问题是,实际的SOAP调用并不成功。我使用SOAPUI来尝试SOAP调用,但只是为了能够查询WSDL。我得到以下错误:-

javax.servlet.ServletException: Servlet execution threw an exception org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) root cause java.lang.LinkageError: loader constraint violation: when resolving overridden method "org.apache.cxf.jaxb.attachment.JAXBAttachmentUnmarshaller.getAttachmentAsDataHandler(Ljava/lang/String;)Ljavax/activation/DataHandler;" the class loader (instance of org/jboss/classloader/spi/base/BaseClassLoader) of the current class, org/apache/cxf/jaxb/attachment/JAXBAttachmentUnmarshaller, and its superclass loader (instance of ), have different Class objects for the type r used in the signature org.apache.cxf.jaxb.JAXBDataBase.getAttachmentUnmarshaller(JAXBDataBase.java:78) org.apache.cxf.jaxb.io.DataReaderImpl.createUnmarshaller(DataReaderImpl.java:123) org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:156) org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109) org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:207) org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:209) org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:191) org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:114) org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:185) org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:108) javax.servlet.http.HttpServlet.service(HttpServlet.java:754) org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:164) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) javax.servlet.ServletException:servlet执行引发异常 org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) 根本原因 java.lang.LinkageError:loader约束冲突:解析当前类的重写方法“org.apache.cxf.jaxb.attachment.JAXBAttachmentUnmarshaller.getAttachmentsDataHandler(Ljava/lang/String;)Ljavax/activation/DataHandler;”类加载器(org/jboss/classloader/spi/base/BaseClassLoader的实例)时,org/apache/cxf/jaxb/attachment/jaxbatachmentunmarshaller及其超类加载器(的实例)对于签名中使用的类型r具有不同的类对象 org.apache.cxf.jaxb.JAXBDataBase.getAttachmentUnmarshaller(JAXBDataBase.java:78) org.apache.cxf.jaxb.io.DataReaderImpl.createUnmarshaller(DataReaderImpl.java:123) org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:156) org.apache.cxf.interceptor.docliteralinterceptor.handleMessage(docliteralinterceptor.java:109) org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:207) org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:209) org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:191) org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:114) org.apache.cxf.transport.servlet.AbstractHTTPServlet.HandlerRequest(AbstractHTTPServlet.java:185) org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:108) javaservlet.http.HttpServlet.service(HttpServlet.java:754) org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:164) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)
LinkageError
是JBoss通常是由于您的应用程序打包了JBoss认为受限制的某些库的副本而导致的。这些通常是
java.*
javax.*
包中的内容

查看堆栈跟踪,我猜罪魁祸首是
javax.activation.DataHandler
。检查应用程序的绑定JAR文件,确保其中没有类似的内容。如果有,则将其移除


它可能不是javax.activation.DataHandler,但可能是它所依赖的东西。

我终于解决了这个问题,但它确实很奇怪

  • 我添加了cxf rt前端jaxws和cxf bundle rs作为依赖项,并标记了一些排除->jetty server,gernomino servlet
  • 我将beans.xml放在WEB-INF文件夹下,但必须将其放在src/main/resources下。beans.xml应该位于类路径下,而不是WEB-INF

  • 感谢您的回复。

    这听起来真的很可怕:
    java.lang.LinkageError:loader约束冲突:在解析重写的方法“org.apache.cxf.jaxb.attachment.JAXBAttachmentUnmarshaller.getAttachmentAsDataHandler(Ljava/lang/String;)Ljavax/activation/DataHandler;”类加载器(当前类的org/jboss/classloader/spi/base/BaseClassLoader实例)、org/apache/cxf/jaxb/attachment/JAXBAttachmentUnmarshaller及其超类加载器(的实例),对于签名中使用的r类型有不同的类对象
    我的意思是,不同的
    对象?听起来肯定像是类装入器游戏出错了。(没有足够的调试经验来提供帮助。)我的理解是,JAXBAttachmentUnmarshaller类被装入两次(或者已经装入),以及getAttachmentAsDataHa‌​ndler方法签名是不同的。我不确定这是否有意义。但需要去掉其中一个,但不知道是哪一个,也不知道如何使用。@DonalFellows这里的问题是JBoss附带Java 6+,而javax.Activation.DataHandler实际上包含在标准Java 6中。当它与不同的类加载器混合使用时,没有办法实现able委托EAR/WAR使用它自己的
    javax.activation.DataHandler
    ,因为它是一个系统级类。因此出现LinkageError。如果它是JBoss包含的JAR,则上一个父机制可以工作。@Vivekragunahan它可能不是JAXBAttachmentUnmarshaller的原因是因为JAXBAttachmentUnmarshaller不是一个系统级类ass(它不包含在Java运行时中),因此不应发生LinkageError这些是我的包库(WEB-INF\lib)中的JAR。它没有任何javax。*但我如何找到依赖于它的是哪一个呢?aopalliance-1.0.jar、asm-3.3.jar、commons-logging-1.1.1.jar、cxf-api-2.4.6.jar、cxf-bundle-jaxrs-2.4.6.jar、cxf-common-utilities-2.4.6.jar、cxf-rt-bindings-soap-2.4.6.jar、cxf-rt-bindings-bindings-xml-2.4.6.jar、cxf-rt-rt-xml-xml-2.4.6.jartend-jaxws-2.4.6.jar、cxf-rt-frontend-simple-2.4.6.jar、cxf-rt-transports-common-2.4.6.jar、cxf-rt-transports-http-2.4.6.jar、cxf-rt-ws-addr-2.4.6.jar、cxf-tools-common-2.4.6.jar