Вопрос по java, soap – LinkageError при попытке вызвать веб-сервис CXF / SOAP

2

У меня есть проект (скажем, myproject), в котором я размещал сервис CXF RESTful и сервис CXF WS / SOAP и работал на JBoss (6.0.0.FINAL). Интерфейс RESTful используется всеми нашими внутренними системами, а интерфейс SOAP - сторонними системами (в качестве интерфейса обратного вызова).

Следующие URL работают нормально.

  • REST URL: http://localhost:8080/myproject/internal/someOperation (content-type: application/json and POST body)

  • SOAP WSDL: 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)
Я имею в виду, разныеClass объекты? Определенно звучит как игры класс загрузчик пошло не так. (Не хватает опыта отладки этих вещей, чтобы помочь.) Donal Fellows
Насколько я понимаю, класс JAXBAttachmentUnmarshaller загружается дважды (или уже), а сигнатуры метода getAttachmentAsDataHa & # x200C; & # x200B; ndler различаются. Я не уверен, имеет ли это смысл. Но нужно избавиться от одного из них, но не знаю, какой и как. Vivek Ragunathan
Это звучит действительно страшно: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 Donal Fellows
@VivekRagunathan Причина, по которой он, вероятно, не является JAXBAttachmentUnmarshaller, заключается в том, что JAXBAttachmentUnmarshaller не является системным классом (он не включен в среду выполнения Java), поэтому LinkageError не должен возникать John Vint
@DonalFellows Проблема здесь в том, что JBoss поставляется с Java 6+, а javax.activiation.DataHandler фактически включен в стандартную Java 6. При смешивании его с различными загрузчиками классов нет возможности делегировать EAR / WAR для его использования & apos; с собственнымиjavax.activation.DataHandler так как это класс системного уровня. Отсюда LinkageError. Если бы это был JAR, включенный для JBoss, то работал бы родительский последний механизм. John Vint

Ваш Ответ

2   ответа
5

LinkageError JBoss обычно вызывается тем, что ваше приложение упаковывает свои собственные копии определенных библиотек, которые JBoss считает ограниченными. Это обычно вещи вjava.* а такжеjavax.* пакеты.

Глядя на ваш след стека, я предполагаю, что виновникjavax.activation.DataHandler, Проверьте связанные JAR-файлы вашего приложения, убедитесь, что в них нет ничего подобного. Если есть, то удалите его.

А может и не бытьjavax.activation.DataHandler, но может быть что-то, от чего это в свою очередь зависит.

Error: User Rate Limit Exceeded Vivek Ragunathan
Error: User Rate Limit Exceeded Vivek Ragunathan
Error: User Rate Limit Exceeded Vivek Ragunathan
Error: User Rate Limit Exceededjavax.activation.DataHandlerError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

Я наконец решил проблему, но это действительно странно.

  1. I added cxf-rt-frontend-jaxws and cxf-bundle-rs as dependencies and mark some exclusions -> jetty-server, gernomino-servlet.
  2. I had the beans.xml under WEB-INF folder but had to place it under src/main/resources. The beans.xml is expected to be under the classpath, instead of WEB-INF.

Спасибо за ваши ответы.

Похожие вопросы