문제

다른 웹 서비스를 호출하고 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
도움이 되었습니까?

해결책

너무 늦었을 수도 있지만 설명 된 내용으로 고통 받고있는 것 같습니다. 여기. Java 6의 Xerces 구현은 Spring 웹 서비스와 호환되지 않습니다. 그들의 해결책은 승인 된 libs를 엉망으로 시작하는 것이지만, 이것은 내가 피하고 싶은 것입니다. JVM 설치를 수정하지 않는 좋은 솔루션을 아직 찾지 못했습니다.

Arjen Poutsma에는 또 다른 해결책이있는 것 같습니다. 그는 모든 Xerces와 Xalan 의존성을 제거했습니다. 그런 다음 작동합니다. 웹 서비스 애플리케이션의 다른 부분에서 Xerces/Xalan의 기능이 필요하지 않으면 시도해 볼 수 있습니다. 관련 티켓은입니다 SWS-175.

다른 팁

나는 Soap Web Service의 Spring Client가 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에 대한 문제를 해결했습니다.

나는 오늘 같은 문제에 직면했다. 가능한 모든 방법을 시도하고 마침내 xalan.jar 및 xerces.jar를 제거했습니다. 실제로 Xalan과 Xerces jars뿐만 아니라 XercesImpl.jar와 모든 버전의 Xalan Jars.

이제 완전히 잘 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top