0

Spring-WS と WebServiceTemplate を使用して SOAP WebService を呼び出しています。現在、SOAP ヘッダーの更新中に問題に直面しています。

以下は、SOAP リクエストの完全な構造です。

<SOAP:envlope>
    <SOAP:Header>
        <Security>
            <username>?</username>
            <password>?</password>
        </Security>
        <MessageData>
            <ClientIP>?</ClientIP>
        </MessageData>
    </SOAP:Header>
    <SOAP:Body>
        <Login/>
    </SOAP:Body>
</SOAP:envlope>

上記のように、ヘッダーに 2 つの要素を含める必要があります。WebServiceTemplate の SOAP のヘッダーを更新するコードを以下に示します。

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new StringSource(soapHeaderStr), ((SoapMessage) message).getSoapHeader().getResult());

しかし、2 つの要素 (文字列) でヘッダーを更新しようとすると、以下のエラー メッセージが表示されます。

SOAPHeaderString

<Security>
   <username>?</username>
   <password>?</password>
</Security>
<MessageData>
   <ClientIP>?</ClientIP>
</MessageData>

エラー

[Fatal Error] :1:197: The markup in the document following the root element must be well-formed.
ERROR:  'The markup in the document following the root element must be well-formed.'

その理由は、SecurityandMessageData要素にはルート要素がなく、そうであってはならないからです。

そのような場合、どうすればヘッダーを更新できますか?

ありがとう

4

2 に答える 2

0

同じ問題があり、それを解決することができました。ここを参照してください

基本的に、 Transformer を使用するように結合する代わりに、次のように 2 つの要素を直接 SOAP ヘッダーにマーシャリングできます。

webServiceTemplate.getMarshaller().marshal(element1,soapHeader.getResult());
webServiceTemplate.getMarshaller().marshal(element2,soapHeader.getResult());

ここでいうマーシャラーは「org.springframework.oxm.jaxb.Jaxb2Marshaller」です。 上記の要素 1 と 2 は、生成されたオブジェクト ファクトリ クラスを使用して作成された JAXB 要素です。

于 2014-09-15T04:12:49.247 に答える