2010-10-27 2 views
15

Я вызываю веб-сервис SOAP с помощью Spring-WS. Вебсервис в вопросе требует от меня, чтобы передать какую-то информацию в заголовке SOAP, как показано здесь:Добавить дочерние элементы в пользовательский заголовок SOAP в 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> 

Я понял, как был верхний 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, кажется, не возникает никаких средств на самом деле добавить ребенка. Я знаю, что могу добавить атрибут, но это не то, что мне нужно для этого вызова службы. Кто-нибудь знает, как я могу добавить необходимые дочерние элементы в свой собственный заголовок?

ответ

1

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

+1

Вы имеете в виду что-то похожее на это сообщение: http://stackoverflow.com/questions/4046075/how-to-add-soap-headers-to-spring-jax-ws-client, где Transformer используется после литья сообщение SOAPMessage? Я согласен, что это не очень приятно и элегантно. Интересно, почему. – chris

+1

-1 Не совсем ответ. Постскриптум ссылка, предоставленная @chris, имеет хорошие решения. – kaskelotti

+1

Ваш ответ, даже обозначенный как правильный, не помог нам вообще. – marionmaiden

8

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

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> 

BTW javax.xml.soap.SOAPMessage может работать также, см. здесь: 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()); 

Произведено производство

<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

Добро пожаловать в SO! Пожалуйста, укажите объяснение того, что делает ваш код и как он отвечает на вопрос. Если вы получите фрагмент кода в качестве ответа, вы можете не знать, что с ним делать. Ответ должен дать руководство OP о том, как отлаживать и исправлять свою проблему. Указывая, что представляет собой идея вашего кода, очень помогает в понимании проблемы и применении или изменении вашего решения. – Palec

0

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

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

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