jax create java web-services spring jsp spring-ws

java - create - tomcat jax ws implementation



Spring-ws-Problem request webservice desde tomcat 6 (3)

Implementé un cierto servicio de Spring-ws y cuando envié un mensaje de jabón recibí en la aplicación weba 1 (que se ejecuta en Tomcat 6.0.32):

Solicitud:

<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>

Respuesta

<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>

Hasta ahora no hay problema Desde una aplicación web 2 (sin usar MVC de primavera, etc.) hice una función y cuando ejecuto esta función funciona:

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; }

Salida:

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

Entonces esto funciona bien y como se esperaba. Pero cuando quiero llamar a la función

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

dentro de un JSP (runnning en el mismo servidor de tomcat) o una clase simple, obtengo el siguiente error:

Servidor:

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

Cliente:

org.springframework.ws.soap.saaj.SaajSoapMessageException: No se pudo escribir el mensaje en OutputStream: Error al guardar un mensaje de varias partes; la excepción anidada es com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Error al guardar un mensaje de varias partes

Estoy usando la siguiente versión de Java que apunta a myeclipse y tomcat (se ejecuta):

* JDK 1.6.0_13 *

Paso:

  • xercesImpl-2.9.1.jar
  • xalan-2.7.1.jar
  • serializer-2.7.1.jar
  • spring-ws-1.5.9-all.jar
  • spring.jar (2.5.6)
  • xml-apis-1.3.04.jar
  • xml-apis-ext-1.3.04.jar

Stacktrace completo del cliente

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 del servidor **

**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**

**

con suerte, esto es suficiente información para resolver el problema. Encontré algunos mensajes y errores que señalan el hecho de que necesito eliminar algunos archivos JAR (xalan, xercesImpl y serializador) de los proyectos y agregar estos jdk/lib/endorsed/ a la jdk/lib/endorsed/ y agregar a tomcat el argumento: -Djava.endorsed.dirs= . Esto funciona, pero no puedo hacer esto porque las aplicaciones ya se ejecutan en varios servidores.

Thx por adelantado

Solución alternativa

Lo resolvió por ahora mientras usaba Apache CXF en el cliente. Y spring-ws 1.5.9 en el servidor ... aparentemente spring-ws es una mierda con jdk> 1.5


Tal vez deberías intentar actualizar a xerces-2.10.x, el problema puede ser que en jdk6 (rt.jar) hay un paquete com.sun.org.apache.xerces que parece contener una implementación de jaxp 1.4, por lo que hace xerces 2.10+:

"También contiene una implementación de las partes relacionadas con el analizador de JAXP 1.4"

cita de aquí .

¿Estás construyendo el binario que contiene el jsp como un proceso separado o estás construyendo todo junto? Si está separado, puede intentar eliminar xerces y xalan únicamente de la ruta de compilación de ese paquete. - Si no puede, intente actualizar quizás sea de ayuda.

Aún así creo que sería mejor tener un servicio llamando a su ws e invocaría ese servicio desde jsp, de esa manera podría probarlo por separado, pero quizás no pueda hacerlo por alguna razón.

Si ambos fallan, ¿puedes publicar a) stacktrace completo b) algunos de los errores que aparecen si eliminas xerces y xalan alltogether?


Lo resolvió por ahora usando Apache CXF 2.4.0 en el cliente. Y spring-ws 1.5.9 en el servidor ... aparentemente spring-ws es una mierda con jdk> 1.5


Este es un problema conocido con Spring-WS y Java 6, ver ticket SWS-175 . De acuerdo con este boleto, la solución es eliminar Xalan y Xerces de su ruta de clases de aplicaciones web.