Добавьте дочерние элементы в пользовательский заголовок SOAP в Spring-WS - PullRequest
15 голосов
/ 27 октября 2010

Я звоню на веб-службу SOAP с помощью Spring-WS.Рассматриваемый веб-сервис требует, чтобы я передал некоторую информацию в заголовок SOAP, как показано здесь:

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

Я выяснил, как получить верхний уровень CustomHeaderElement, но ничего не вижу в Spring-WS API, который позволяет мне добавлять дочерний элемент.Вот что у меня есть:

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

Проблема в том, что headerElement, похоже, не предоставляет никаких средств для фактического добавления потомка.Я знаю, что могу добавить атрибут, но это не то, что мне нужно для этого вызова службы.Кто-нибудь знает, как я могу добавить необходимые дочерние элементы в свой пользовательский заголовок?

Ответы [ 4 ]

8 голосов
/ 15 февраля 2012

Я сталкивался с той же проблемой, вот мое решение, но оно будет работать только на простые элементы, а не на сложные:

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

выдает следующий XML:

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

Кстати javax.xml.soap.SOAPMessage тоже может работать, см. Здесь: http://docs.oracle.com/javaee/5/tutorial/doc/bnbhr.html#bnbia

3 голосов
/ 17 февраля 2014
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());

Получено продукции

<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>
1 голос
/ 15 ноября 2010

Я не доволен этим решением, но, как оказалось, вы можете на самом деле передать сообщение в SOAPMessage, которое дает вам полный доступ ко всем API-интерфейсам SAAJ.Оттуда вы можете создавать любые элементы внутри заголовка.

0 голосов
/ 18 августа 2016

У меня была такая же проблема, и я решил ее с помощью следующего фрагмента:

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

Метод createCustomerHeader() создает компонент JAXB, сгенерированный из XSD.

...