Пустой ответ SOAP — с использованием JBoss 4.2, Jaxb2, Java 1.6

#web-services #spring #jboss #jaxb2 #saaj

#веб-службы #весна #jboss #jaxb2 #saaj

Вопрос:

Я пытаюсь развернуть веб-сервис spring-ws SOAP в JBoss 4.2 (JDK 1.6, spring 3.0, spring-ws 2.0). Я использую JAXB2 в качестве привязки O / X. Настройка в порядке, компоненты найдены и подключены, запросы могут быть отправлены, и ответы генерируются. Тем не менее, я получаю пустые ответы. Он не находится в конверте SOAP и не содержит никаких сведений о моем простом пользователе, собранных на сервере.

Правильный ответ будет:

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
       <ns2:UserDetails xmlns:ns2="http://a.dol.com/schemas">
          <ns2:name>John</ns2:name>
          <ns2:lastname>PerX</ns2:lastname>
       </ns2:UserDetails>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  

Но я просто получаю что-то вроде:

 <Envelope>
    <Header/>
    <Body>
       <ns2:UserDetails xmlns:ns2="http://a.dol.com/schemas"/>
   </Body>
</Envelope>
  

После поиска в Google я нашел следующий код, который нужно добавить:

 <beans>
  <!-- Big magic hack to fix the broken SAAJ in JBoss
   See http://static.springsource.org/spring-ws/sites/1.5/faq.html#saaj-jboss -->
   <bean id="messageFactory">
     <property name="messageFactory">
       <!-- This is the Java 6 variant of this fix! Note the "internal" package missing in the spring-ws FAQ. -->
       <bean class="com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"/>
     <property>
   <bean/>
</beans>
  

Но это также не помогает, я получаю ошибку folloiwng:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageFactory' defined in ServletContext resource...

Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError...
    Caused by: java.lang.IllegalArgumentException: com.sun.xml.messaging.saaj.soap.LocalStrings != com.sun.xml.internal.messaging.saaj.soap.LocalStrings
  

Любые подсказки приветствуются.

Обновлено

Обновление run.bat для JBoss следующим образом устраняет проблему, но правильно ли это сделать??

 set JAVA_OPTS=%JAVA_OPTS% -Djavax.xml.soap.SOAPConnectionFactory=com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnectionFactory
set JAVA_OPTS=%JAVA_OPTS% -Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl
set JAVA_OPTS=%JAVA_OPTS% -Djavax.xml.soap.SOAPFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPFactory1_1Impl
  

Комментарии:

1. добавление следующего исправляет это, но правильный ли это подход? (см. Отредактированный вопрос)

Ответ №1:

Замените фрагмент spring на

 <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="messageFactory">
        <bean class="com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"/>
    </property>
</bean>
  

Вы не указали полное имя класса в определении компонента MessageFactory.
Тогда это должно работать без параметров запуска.

Ответ №2:

Обновление run.bat для JBoss следующим образом устраняет проблему:

 set JAVA_OPTS=%JAVA_OPTS% -Djavax.xml.soap.SOAPConnectionFactory=com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnectionFactory
set JAVA_OPTS=%JAVA_OPTS% -Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl
set JAVA_OPTS=%JAVA_OPTS% -Djavax.xml.soap.SOAPFactory=com.sun.xml.messaging.saaj.soap.ver1_1.SOAPFactory1_1Impl