Spring将两个元素添加到SOAP标头中

时间:2014-09-14 08:37:19

标签: spring soapheader

我的问题基本上与this question相同 我没有足够的声誉来对OP的问题添加评论。请帮忙

我遇到的问题是:
我试图调用的 SOAP Web服务要求标题包含两个元素,一个包含基本标题数据,另一个包含同步特定数据,所需的标题如下所示:

<header>
  <initHeader>
    <requestID></requestId>
    <...some more elements>
  </initHeader>
 <syncHeader>
    <appId></appId>
    <dateTime></dateTime>
    <event></event>
 </syncHeader>
</header>

使用WebServiceMessageCallback生成标题时(特别是在下面显示的转换过程中),我得到了这个:

"ERROR: 'The markup in the document following the root element must be well-formed.'"

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

这里的问题是变换器期望标头中的所有元素都在一个根元素下。但在这里,标题有两个。

我改变了这样的标题数据(如下),变压器没有抱怨。

    <header>
      <myRootelement>
      <initHeader>
        <requestID></requestId>
        <...some more elements>
      </initHeader>
     <syncHeader>
        <appId></appId>
        <dateTime></dateTime>
        <event></event>
     </syncHeader>
     </myRootelement>
    </header>

根据上面提到的问题,OP通过添加如上所述的虚拟根元素然后在将其转换为标题之前将其删除来解决了这个问题。

我想知道如何删除虚拟根元素?这样的事情可能会是什么? http://technology.amis.nl/2011/05/16/how-to-remove-unwanted-soap-header-elements-in-jax-ws/
我不太确定如何在保持孩子完整的同时删除根元素。

1 个答案:

答案 0 :(得分:1)

管理解决问题,方法如下:

而不是将两个元素编组到StringResult对象中,然后尝试使用Transformer将它们添加到标头中,如下所示:

StringResult stringResult = new StringResult();
webServiceTemplate.getMarshaller().marshal(element, stringResult);
StringSource headerSource = new StringSource(stringResult.toString());
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(headerSource, soapHeader.getResult());

您可以直接将两个元素编组到soap标头中,如下所示:

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

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

使用这种方法,无需添加虚拟根元素。

希望这可以帮助那里的人,感谢Grigori.G指出我正确的方向!