Spring + SOAPExceptionImpl: ошибка при сохранении составного сообщения

У меня есть весеннее веб-приложение с страницами jsp, которое вызывает разные веб-службы и отображает результаты на странице jsp. К весеннему веб-приложению прикреплена безопасность имени пользователя/логина.

Я добавляю вызов веб-службы, отвечающей за безопасность. Для WebServiceGateway я добавил перехватчик безопасности. (Смотри ниже)

<bean id="securityInterceptor"
    class="org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor">
    <property name="securementActions" value="UsernameToken Timestamp" />
    <property name="securementUsername" value="Bert" />
    <property name="securementPassword" value="Ernie" />
    <property name="timestampPrecisionInMilliseconds" value="true" />
</bean>

Когда я добавил wss4j в свой файл pom, теперь я получаю следующую ошибку на стороне веб-службы:

[28-13:46:26]DEBUG: org.springframework.web.servlet.FrameworkServlet.processRequest(): Could not complete request [http-8080-2]
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
    at org.springframework.ws.soap.saaj.SaajSoapMessage.writeTo(SaajSoapMessage.java:163)
    at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:172)
    at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88)
    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 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:128)
    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:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:619)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Error during saving a multipart message
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1124)
    at org.springframework.ws.soap.saaj.Saaj13Implementation.writeTo(Saaj13Implementation.java:268)
    at org.springframework.ws.soap.saaj.SaajSoapMessage.writeTo(SaajSoapMessage.java:159)
    ... 20 more
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to get header stream in saveChanges: 
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1101)
    ... 22 more
Caused by: 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:295)
    at com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl.output(EnvelopeImpl.java:306)
    at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getContentAsStream(SOAPPartImpl.java:302)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.getHeaderBytes(MessageImpl.java:945)
    at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1096)
    ... 22 more

person htkhtk    schedule 28.10.2009    source источник


Ответы (3)


Возможно, уже слишком поздно, но, похоже, вы страдаете от того, что описано здесь. Реализация Xerces в Java 6, по-видимому, несовместима с веб-сервисами Spring. Их решение состоит в том, чтобы начать возиться с одобренными библиотеками, но я хотел бы избежать этого. Я еще не нашел хорошего решения, которое не требует изменения установки JVM.

У Арьена Поутсмы, кажется, есть другое решение. Он удалил все зависимости Xerces и Xalan. Тогда это работает. Если вам не нужны функции Xerces/Xalan в какой-либо другой части приложения веб-службы, вы можете попробовать это. Соответствующий билет: SWS-175.

person Matthijs Bierman    schedule 07.12.2009
comment
Я столкнулся с той же проблемой. Я попытался поместить банки Xerces и Xalan в одобренную папку Tomcat. Но он просто продолжает спрашивать, что мне не хватает еще одной банки. Забудь это. Что я сделал, так это удалил Xerces и Xalan (то же самое, что сделал Арьен). И это сработало! - person chris; 01.02.2011
comment
@ Христос, так ты просто исключаешь это? - person AHungerArtist; 04.04.2012

У меня возникла точно такая же проблема, когда клиент spring веб-службы мыла работал абсолютно нормально при тестировании на tomcat и выдавал следующее исключение при тестировании на jboss:

org.springframework.ws.soap.saaj.SaajSoapMessageException: Could not write message to OutputStream: Error during saving a multipart message; nested exception is com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during saving a multipart message

С ответом, данным выше, я изменил файл структуры jboss-deployment-structure следующим образом и добавил активацию, xerces и xalan в исключение:

<exclusions>
     <module name="org.apache.commons.logging" />
     <module name="org.apache.log4j" />
     <module name="org.jboss.logging" />
     <module name="org.jboss.logging.jul-to-slf4j-stub" />
     <module name="org.jboss.logmanager" />
     <module name="org.jboss.logmanager.log4j" />
     <module name="org.slf4j" />
     <module name="org.slf4j.impl" />
     <module name="javaee.api"/> 
     <module name="javax.ws.rs.api"/>
     <module name="org.apache.xalan"/>
     <module name="org.apache.xerces"/>
     <module name="javax.activation.api"/>
</exclusions>

Это решило проблему с jboss.

person Kamal Kishore    schedule 26.04.2016

Я столкнулся с той же проблемой сегодня. Перепробовал все возможные способы и в итоге удалил Xalan.jar и xerces.jar. На самом деле не только Xalan и Xerces JARS, но и XercesImpl.jar, а также все версии Xalan JARS.

Теперь он работает совершенно нормально.

person CodingOwl    schedule 26.05.2016