我使用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());
但是当我尝试使用两个元素(String)更新标头时,我收到以下错误消息:
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
元素没有根元素,它不应该是。
请帮助我在这种情况下如何更新标题?
由于
答案 0 :(得分:0)
最后,解决了!!
我在转换时添加了伪root,然后从SOAP Header中删除了伪根。
答案 1 :(得分:0)
遇到同样的问题并设法解决,请参阅here
基本上你可以将这两个元素直接编组到soap标题中,而不是绑定使用Transformer:
webServiceTemplate.getMarshaller().marshal(element1,soapHeader.getResult());
webServiceTemplate.getMarshaller().marshal(element2,soapHeader.getResult());
这里提到的编组人员是&#34; org.springframework.oxm.jaxb.Jaxb2Marshaller&#34;上面的元素1和2是使用生成的Object工厂类创建的JAXB元素。