Saltar al contenido

El cliente Spring-WS no configura el encabezado SOAPAction

Este grupo de especialistas despúes de algunos días de investigación y de recopilar de información, obtuvimos la respuesta, queremos que todo este artículo sea de utilidad para tu trabajo.

Solución:

Una respuesta completa es la siguiente.

Mientras estás usando WebServiceTemplate como clase para comunicarse con el servicio web, no entiendo por qué, pero no llena correctamente el encabezado HTTP.

Algunos WSDL tienen una parte que dice:


Y el WebServiceTemplate ignora esta parte. El error anterior significa que su soapAction El parámetro en el encabezado está vacío. Y no debería serlo. Consulte con Wireshark. Lo hice, usando un cliente de Chrome Soap y Spring. El segundo tiene un encabezado no válido.


Para solucionar esto, debe seguir la Sección 6.2.4 aquí: http://docs.spring.io/spring-ws/sites/2.0/reference/html/client.html

Lo que dice es básicamente agregar la parte del encabezado por su cuenta, con WebServiceMessageCallback interfaz. Puedes leer más en la referencia.

Básicamente termina así:

 webServiceTemplate.marshalSendAndReceive(o, new WebServiceMessageCallback() 

    public void doWithMessage(WebServiceMessage message) 
        ((SoapMessage)message).setSoapAction("http://tempuri.org/Action");
    
);

Donde puede configurar correctamente el valor del encabezado. Trabajó para mí también. Todo el día de lectura.

Resolví esto pero nunca publiqué la respuesta. Esto es lo que terminé con que funciona bien:

public WebServiceTemplate getWebServiceTemplate() throws SOAPException 
  if (webServiceTemplate == null) 
    final MessageFactory msgFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
    final SaajSoapMessageFactory newSoapMessageFactory = new SaajSoapMessageFactory(msgFactory);
    webServiceTemplate = new WebServiceTemplate(newSoapMessageFactory);
     

  return webServiceTemplate;


public Object sendReceive(Object requestObject, ArrayList classesToMarshall, final String action)
        throws ClassNotFoundException, SoapFaultException, SoapFaultClientException, WebServiceTransportException,
        IllegalStateException, SOAPException 

  final WebServiceTemplate wst = getWebServiceTemplate();

    final SoapMarshallUtil smu = getSoapMarshallUtil();
    smu.configureMarshaller(wst, classesToMarshall);

    // soap 1.2
    SoapActionCallback requestCallback = new SoapActionCallback(action) 
        public void doWithMessage(WebServiceMessage message) 
            SaajSoapMessage soapMessage = (SaajSoapMessage) message;
            SoapHeader soapHeader = soapMessage.getSoapHeader();

            QName wsaToQName = new QName("http://www.w3.org/2005/08/addressing", "To", "wsa");
            SoapHeaderElement wsaTo =  soapHeader.addHeaderElement(wsaToQName);
            wsaTo.setText(uri);

            QName wsaActionQName = new QName("http://www.w3.org/2005/08/addressing", "Action", "wsa");
            SoapHeaderElement wsaAction =  soapHeader.addHeaderElement(wsaActionQName);
            wsaAction.setText(action);
        
    ;

    Object responseObject = wst.marshalSendAndReceive(this.uri, requestObject, requestCallback);
    return responseObject;

Comentarios y puntuaciones

Tienes la opción de añadir valor a nuestra información añadiendo tu veteranía en las observaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *