2012-07-24 24 views
5

Tengo dificultades para llamar a un SOAP 1.2 WebService a través de Spring-ws WebServiceTemplate. A la solicitud que se está realizando le falta SOAPAction en Http Header y el servidor arroja un error con "No se puede gestionar la solicitud sin un parámetro de acción válido. Proporcione una acción válida válida". Pude descubrir que faltaba la Acción SOAP al monitorear a través de wireshark. Tampoco estoy detrás de ningún proxy.Spring WebService Template SOAPA falta en el encabezado HTTP

Me he asegurado de que el XML de SOAP que estoy tratando de enviar sea válido ejecutando la solicitud a través de TCP Mon (herramienta como SOAP UI) y pude obtener una respuesta.

Aquí es mi primavera config:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:util="http://www.springframework.org/schema/util" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
         http://www.springframework.org/schema/util 
         http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"> 
    <property name="soapVersion"> 
    <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" /> 
    </property> 
</bean> 

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> 
<constructor-arg ref="messageFactory" /> 
<property name="defaultUri" value="https://ecomapi.networksolutions.com/soapservice.asmx" /> 
<property name="messageSender"> 
    <bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender" />  </property> 
</bean> 

y este es mi código de Java:

  public void simpleSendAndReceive() { 
      try{ 
      StreamSource source = new StreamSource(new StringReader(MESSAGE)); 
      StreamResult result = new StreamResult(System.out); 
      SoapActionCallback actionCallBack = new SoapActionCallback("https://ecomapi.networksolutions.com/soapservice.asmx") { 
       public void doWithMessage(WebServiceMessage msg) { 
        SoapMessage smsg = (SoapMessage)msg; 
        smsg.setSoapAction("http://networksolutions.com/ReadOrder"); 
       } 
      }; 
      webServiceTemplate.sendSourceAndReceiveToResult(
        "https://ecomapi.networksolutions.com/soapservice.asmx", 
        source, 
        new SoapActionCallback("http://networksolutions.com/ReadOrder"), 
    //      actionCallBack, 
        result); 


      System.out.println(source.getInputStream().toString()); 
      System.out.println(result.getWriter().toString()); 

      }catch (SoapFaultClientException e) { 
       System.out.println(e.getFaultCode()); 
       System.out.println(e.getFaultStringOrReason()); 
       System.out.println(e.fillInStackTrace().getLocalizedMessage()); 
      } catch (WebServiceIOException we) { 
       System.out.println(we.getRootCause()); 
      } 
     } 
+0

Parece que está estableciendo los encabezados de Acción SOAP de varias maneras aquí a la derecha - usando 'actionCallBack', usando' 'SoapActionCallback..', ¿ambos enfoques no funcionan? –

+0

Eso es correcto. Ambos enfoques devuelven el mismo error. – user1546703

+0

Necesita un encabezado 'http: // networksolutions.com/ReadOrder' a la derecha: ¿qué encabezado ve sobre el cable utilizando wireshark? Solo quiero asegurarme de que no está enviando 'https: // ecomapi.networksolutions.com/soapservice.asmx'. Esta es una herramienta simple para capturar lo que va y viene - http://sourceforge.net/projects/nettool/ –

Respuesta

1

que enfrentan el mismo problema y me remontar de nuevo a un error en el 1.3.2 versión de la implementación com.sun.xml.messaging.saaj.soap.MessageImpl (http://java.net/jira/browse/SAAJ-37). Actualicé a la versión 1.3.19 y todo estaba bien.

La cuestión: -

Antes de escribir la solicitud a la corriente de salida, los saveChanges() se llama al método. La versión 1.3.2 de esta clase sobrescribía el encabezado de la solicitud 'Content-Type' en su implementación del método 'saveChanges'.

0

Tuve un problema similar debido a que el espacio de nombre de la anotación XmlSchema en el archivo package-info.java era diferente de lo que esperaba el servicio soap que estaba tratando de llamar. Esto resultó de mí usando xjc para generar la solicitud jaxb y los objetos de respuesta de un xsd que había cosido juntos de las partes wsdl más el encabezado xsd de un servicio anterior que estaba interactuando, así que fue un error puro de cortar y pegar de mi parte pero la respuesta anterior aquí sobre el espacio de nombres fue lo que me dio la pista de mi error rápidamente.

0

SOAPAction es obligatorio solo en SOAP 1.1, consulte section Content Type.

El encabezado SOAPAction obligatorio SOAP 1.1 se ha eliminado en SOAP 1.2. En su lugar, hay un parámetro de acción opcional en el tipo de aplicación/soap + xml.

Cuestiones relacionadas