Добавление дочерних элементов в пользовательский заголовок SOAP весной-WS

Я вызываю веб-сервис 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>

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

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 ответов


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

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


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>

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


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

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

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