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>

如上所示,我需要在 Header 中包含 2 个元素。我有以下代码来更新 WebServiceTemplate 的 SOAP 标头

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

但是当我尝试使用两个元素(字符串)更新标头时收到以下错误消息:

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

Security原因是和元素没有根元素MessageData,它不应该是。

请帮助我在这种情况下如何更新标题?

谢谢

4

2 回答 2

0

终于解决了!!

我在转换时添加了虚拟根,然后从 SOAP Header 中删除了该虚拟根。

于 2013-04-01T10:33:32.427 回答
0

遇到了同样的问题并设法解决了,请参见此处

基本上,您可以像这样将这两个元素直接编组到soap标头中,而不是绑定使用 Transformer :

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

这里提到的编组器是“org.springframework.oxm.jaxb.Jaxb2Marshaller” 上面的元素1和2是使用生成的Object工厂类创建的JAXB元素。

于 2014-09-15T04:12:49.247 回答