Spring + SOAPExceptionImpl:マルチパートメッセージの保存中にエラーが発生しました
質問
さまざまなWebサービスを呼び出し、結果をjspページに表示するjspページを持つSpring Webアプリケーションがあります。 Spring Webアプリケーションには、ユーザー名/ログインSpring Securityが添付されています。
セキュリティを処理するWebサービスへの呼び出しを追加しています。 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>
posファイルにwss4jを追加すると、Webサービス側で次のエラーが表示されるようになりました。
[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
解決
少し遅すぎるかもしれませんが、説明されていることに苦しんでいるようですこちら。 Java 6のXerces実装は、明らかにSpring Webサービスと互換性がありません。 彼らの解決策は、承認されたライブラリをいじり始めることですが、これは避けたいものです。 JVMインストールの変更を伴わない優れたソリューションはまだ見つかりません。
Arjen Poutsmaには別の解決策があるようです。彼はすべてのXercesとXalanの依存関係を削除しました。その後、動作します。 Webサービスアプリケーションの他の部分でXerces / Xalanの機能が必要でない限り、これを試すことができます。関連するチケットは SWS-175 です。
他のヒント
Tomcatでテストするとsoap WebサービスのSpringクライアントが完全に正常に動作し、jbossでテストすると次の例外が発生するというまったく同じ問題が発生しました。
org.springframework.ws.soap.saaj.SaajSoapMessageException:メッセージをOutputStreamに書き込めませんでした:マルチパートメッセージの保存中にエラーが発生しました。ネストされた例外はcom.sun.xml.messaging.saaj.SOAPExceptionImpl:マルチパートメッセージの保存中にエラーが発生しました
上記の回答で、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の問題が解決されました。
今日、同じ問題に直面しました。考えられるすべての方法を試し、最終的にXalan.jarとxerces.jarを削除しました。実際、XalanとXerces JARSだけでなく、XercesImpl.jarとXalan JARSのすべてのバージョンも同様です。
今では完全に機能しています。