- java/
- Java 尝试调用CXF/SOAP Web服务时发生LinkageError
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工作正常
现在我的问题是,实际的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类被装入两次(或者已经装入),以及getAttachmentAsDataHandler方法签名是不同的。我不确定这是否有意义。但需要去掉其中一个,但不知道是哪一个,也不知道如何使用。@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