Spring -ws -Проблема запроса webservice от tomcat 6

Я реализую определенную службу spring -ws, и когда я отправил сообщение о мыле, которое я получаю в spring webapplication 1 (работает на tomcat 6.0.32):

Запрос:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gen="http://www.foo.com/bar/webservice/generated">
   <soapenv:Header/>
   <soapenv:Body>
      <gen:GetAllPanelWSRequest/>
   </soapenv:Body>
</soapenv:Envelope>

ответ

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns2:GetAllPanelWSResponse xmlns:ns2="http://www.foo.com/bar/webservice/generated">
         <ns2:PanelWS ns2:Id="5">
            <ns2:name>all</ns2:name>
            <ns2:code>all</ns2:code>
         </ns2:PanelWS>
         <ns2:PanelWS ns2:Id="9">
            <ns2:name>test</ns2:name>
            <ns2:code>test1</ns2:code>
         </ns2:PanelWS>         
      </ns2:GetAllPanelWSResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Пока не проблема. Из веб-приложения 2 (не используя spring MVC и т.д.) Я создал функцию, и когда я запускаю эту функцию, она работает:

Main.java

...
public class Main {
    public static void main(String[] args) {
        List<PanelWS> panelWSs = CallServices.getPanelWSs();
        for (PanelWS p : panelWSs) {
            System.out.println("\t" + makeString(p));
        }
    }
...

CallServices.java

public static List<PanelWS> getPanelWSs() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        PanelClient client = (PanelClient) ctx.getBean("client");
        PanelWS panelWS = null;

        // Get all panelWS
        System.out.println("Get all panels...");
        List<PanelWS> panelWSs = client.getAllPanelWS();
        return panelWSs;
    }

Вывод:

Get all panels...
    [id=5, name=all, code=all]
    [id=9, name=test, code=test1]

Итак, это работает отлично и, как ожидалось. Но когда я хочу вызвать функцию

    <%
        List<PanelWS> panelWSs = CallServices.getPanelWSs();
    %>

в JSP (запуск на том же сервере tomcat) или простой класс, я получаю следующую ошибку:

Сервер:

13-mei-2011 17:57:37 com.sun.xml.internal.messaging.saaj.soap.MessageImpl saveChanges
SEVERE: SAAJ0539: Unable to get header stream in saveChanges
13-mei-2011 17:57:37 com.sun.xml.internal.messaging.saaj.soap.MessageImpl saveChanges
SEVERE: SAAJ0540: Error during saving a multipart message

Клиент:

org.springframework.ws.soap.saaj.SaajSoapMessageException: не удалось записать сообщение в OutputStream: ошибка при сохранении многостраничного сообщения; Вложенное исключение - com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: ошибка при сохранении многостраничного сообщения

Я использую следующую версию Java, указывающую на myeclipse и tomcat (работает):

* JDK 1.6.0_13 *

Приправы:

  • xercesImpl-2.9.1.jar
  • Xalan-2.7.1.jar
  • сериализатору-2.7.1.jar
  • spring -ws-1.5.9-all.jar
  • spring.jar(2.5.6)
  • xml-apis-1.3.04.jar
  • XML-АПИС-доб-1.3.04.jar

Полная стопка клиента

Message:    org.springframework.ws.soap.saaj.SaajSoapMessageException: Could not write message to OutputStream: Error during saving a multipart message; nested exception is com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Error during saving a multipart message
Error ID:   #9yb3mzb7
Stack trace:    org.springframework.ws.soap.saaj.SaajSoapMessage.writeTo(SaajSoapMessage.java:169)
org.springframework.ws.client.core.WebServiceTemplate.sendRequest(WebServiceTemplate.java:580)
org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:549)
org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:502)
org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:351)
org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:345)
org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:337)
com.foo.bar.webservice.client.PanelMGMClientImpl.getAllPanelWS(PanelMGMClientImpl.java:22)
com.foo.bar.webservice.client.CallServices.getPanelWSs(CallServices.java:22)
org.apache.jsp.workspace.aclusers_jsp._jspService(aclusers_jsp.java:786)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

Fullstacktrace сервера **

**SEVERE: Servlet.service() for servlet spring-ws threw exception
java.io.IOException: org.apache.xml.serializer.ToXMLSAXHandler cannot be cast to org.apache.xml.serializer.SerializationHandler
    at com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:298)
    at com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:309)
    at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getContentAsStream(SOAPPartImpl.java:305)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.getHeaderBytes(MessageImpl.java:947)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1098)
    at org.springframework.ws.soap.saaj.Saaj13Implementation.writeTo(Saaj13Implementation.java:268)
    at org.springframework.ws.soap.saaj.SaajSoapMessage.writeTo(SaajSoapMessage.java:165)
    at org.springframework.ws.transport.AbstractWebServiceConnection.send(AbstractWebServiceConnection.java:45)
    at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:97)
    at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57)
    at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:230)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.foo.bar.support.gzip.CompressionFilter.doFilter(CompressionFilter.java:30)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:168)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665)
    at java.lang.Thread.run(Thread.java:619)
16-mei-2011 14:20:12 com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory createEnvelope
SEVERE: SAAJ0511: Unable to create envelope from given source**

**

надеюсь, этого достаточно для решения проблемы. Я нашел некоторые сообщения и ошибки, указывая на то, что мне нужно удалить некоторые Jars (xalan, xercesImpl и serializer) из проектов и добавить эти банки в папку jdk\lib\endorsed\ и добавить в tomcat аргумент: -Djava.endorsed.dirs=. Это работает, но я не могу этого сделать, потому что приложения уже запущены на нескольких серверах.

спасибо заранее

Альтернативное решение

Решено на данный момент при использовании Apache CXF на клиенте. И spring -ws 1.5.9 на сервере... видимо spring -ws отстой с jdk > 1.5

Ответ 1

Решено, что теперь использует клиент Apache CXF 2.4.0. И spring -ws 1.5.9 на сервере... видимо spring -ws отстой с jdk > 1.5

Ответ 2

Возможно, вам стоит попробовать обновить до xerces-2.10.x, проблема может заключаться в том, что в jdk6 (rt.jar) есть пакет com.sun.org.apache.xerces, который, похоже, содержит реализацию jaxp 1.4, так и xerces 2.10 +:

"Он также содержит реализацию связанные с парсером части JAXP 1.4"

цитата из здесь.

Создаете ли вы двоичный файл, содержащий jsp, как отдельный процесс, или вы строите все вместе? Если он разделен, вы можете попытаться удалить xerces и xalan только из пути сборки этого пакета? - Если вы не можете, попробуйте обновить, возможно, это поможет.

По-прежнему считайте, что было бы лучше иметь сервис, вызывающий ваш ws, и вы вызывали бы эту службу из jsp, чтобы вы могли протестировать ее отдельно, но, возможно, вы не можете сделать это по какой-то причине.

Если оба из них терпят неудачу, можете ли вы разместить a) полный стек tt) b) некоторые из ошибок, которые появляются, если вы удаляете xerces и xalan alltogether?

Ответ 3

Это известная проблема с Spring -WS и Java 6, см. билет SWS-175. В соответствии с этим билетом решение состоит в том, чтобы удалить Xalan и Xerces из вашего пути к классу webapp.