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

StackOverflow https://stackoverflow.com/questions/4035423

  •  26-09-2019
  •  | 
  •  

Вопрос

Я называю мыло Webservice с Spring-WS. Обеспечение WebService требует, чтобы я передал некоторую информацию в заголовке 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);
    }
});

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

Это было полезно?

Решение 3

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top