15

Spring-WS で SOAP Web サービスを呼び出しています。問題の Web サービスでは、次に示すように、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

4 に答える 4

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>
于 2014-02-17T11:50:40.240 に答える
1

私はこの解決策に満足していませんが、実際には、すべての SAAJ API に完全にアクセスできる SOAPMessage にメッセージをキャストできることがわかりました。そこから、ヘッダー内に必要な要素を構築できます。

于 2010-11-15T16:03:45.690 に答える
0

同じ問題があり、次のスニペットで解決しました。

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

このcreateCustomerHeader()メソッドは、XSD から生成された JAXB Bean を作成します。

于 2016-08-18T06:49:21.207 に答える