2010-10-27 38 views
15

Llamo a un servicio web SOAP con Spring-WS. El servicio web en cuestión me obliga a pasar alguna información en el encabezado SOAP como se muestra aquí:Agregar elementos secundarios al encabezado SOAP personalizado en Spring-WS

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header> 
     <CustomHeaderElement> 
     <clientID>xyz</clientID> 
     <wsdlVersion>1.0</wsdlVersion> 
     <serviceType>ExampleService_v1</serviceType> 
     </CustomHeaderElement> 
    </soapenv:Header> 
    <soapenv:Body> 
    ... 
    </soapenv:Body> 
</soapenv:Envelope> 

He descubierto cómo tenía la CustomHeaderElement nivel superior, pero no se ve nada en la primavera-WS API que me permite agregar un elemento secundario. Aquí es lo que tengo hasta ahora:

WebServiceTemplate template = ...; 

template.marshalSendAndReceive(request, new WebServiceMessageCallback(){ 
    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException{ 
     SoapMessage soapMessage = (SoapMessage)message; 
     SoapHeader soapHeader = soapMessage.getSoapHeader(); 
     QName qName = new QName("CustomHeaderElement"); 
     SOAPHeaderElement headerElement = soapHeader.addHeaderElement(qName); 
     //would like to do something like headerElement.addChild(clientIdNode); 
    } 
}); 

El problema es headerElement no parece exponer a ningún medio de la adición de un niño en realidad. Sé que puedo agregar un atributo, pero eso no es lo que necesito para esta llamada de servicio. ¿Alguien sabe cómo podría agregar los elementos secundarios necesarios a mi encabezado personalizado?

Respuesta

1

No estoy satisfecho con esta solución, pero resulta que puedes transmitir el mensaje a SOAPMessage, lo que te da acceso completo a todas las API de SAAJ. Desde allí puedes construir cualquier elemento que quieras dentro del encabezado.

+1

¿Te refieres a algo similar a esta publicación: http://stackoverflow.com/questions/4046075/how-to-add-soap-headers-to-spring-jax-ws-client donde se usa un transformador después de la fundición el mensaje a un SOAPMessage? Estoy de acuerdo en que no es realmente agradable ni elegante. Me pregunto porque. – chris

+1

-1 Realmente no es una respuesta. PD el enlace provisto por @chris tiene buenas soluciones. – kaskelotti

+1

Su respuesta, incluso marcada como la correcta, no nos ayudó en absoluto. – marionmaiden

8

me encontré con el mismo problema, aquí está mi solución pero funcionará únicamente elementos simples no por complejo:

template.marshalSendAndReceive(request, new WebServiceMessageCallback(){ 
    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException{ 
     SaajSoapMessage soapMessage = (SaajSoapMessage) message; 
     SoapHeaderElement messageId = soapMessage.getSoapHeader().addHeaderElement(new QName("http://www.w3.org/2005/08/addressing", "MessageID", "wsa")); 
     messageId.setText("urn:abcdef1234"); 
    } 
}); 

Produce siguiente XML:

<SOAP-ENV:Header> 
    <wsa:MessageID>urn:abcdef1234</wsa:MessageID> 
</SOAP-ENV:Header> 

Por cierto javax.xml.soap.SOAPMessage puede trabajar también, ver aquí: http://docs.oracle.com/javaee/5/tutorial/doc/bnbhr.html#bnbia

3
final String datPrefix = "dat"; 
final String datNamespaceUri = "UPRS/Services/IProviderDataManagement/Datatypes"; 

final String mesPrefix = "mes"; 
final String mesNamespaceUri = "UPRS/Services/IProviderDataManagement/Messages"; 

SoapEnvelope se = s.getEnvelope(); 
se.addNamespaceDeclaration(mesPrefix, 
     mesNamespaceUri); 
se.addNamespaceDeclaration(datPrefix, 
     datNamespaceUri); 

SoapMessage s = (SoapMessage) message; 

Element root = new Element("requestContext", mesPrefix, mesNamespaceUri); 
Element child = new Element("commandId", datPrefix, datNamespaceUri).addContent(guid); 
root.addContent(child); 

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
transformer.transform(new JDOMSource(root), s.getSoapHeader().getResult()); 

produjo salida

<SOAP-ENV:Header> 
     <mes:requestContext xmlns:mes="UPRS/Services/IProviderDataManagement/Messages"> 
      <dat:commandId xmlns:dat="UPRS/Services/IProviderDataManagement/Datatypes">ba7b1e13-8a06-49b6-a264-fc0298f55f4f</dat:commandId> 
     </mes:requestContext> 
    </SOAP-ENV:Header> 
+3

Bienvenido a SO! Incluye una explicación de lo que hace tu código y cómo responde la pregunta. Si obtiene un fragmento de código como respuesta, es posible que no sepa qué hacer con él. La respuesta debería dar la orientación OP sobre cómo depurar y corregir su problema. Señalar, cuál es la idea detrás de su código, ayuda enormemente a comprender el problema y aplicar o modificar su solución. – Palec

0

que tenían el mismo problema y lo resolvió con el siguiente fragmento:

Result result = ((SoapMessage) message).getSoapHeader().getResult(); 
webServiceTemplate.getMarshaller().marshal(createCustomHeader(), result); 

El método createCustomerHeader() crea un grano de JAXB que se genera a partir del XSD.

Cuestiones relacionadas