【问题标题】:Spring adding two elements to the SOAP headerSpring 向 SOAP 标头添加两个元素
【发布时间】:2014-09-14 08:37:19
【问题描述】:

我的问题基本上和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/
我不太确定如何删除根元素同时保持其子元素完整。

【问题讨论】:

    标签: spring soapheader


    【解决方案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());
    

    您可以将这两个元素直接编组到肥皂标题中,如下所示:

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

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

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

    希望这对那里的人有所帮助,并感谢 Grigori.G 为我指明了正确的方向!

    【讨论】:

      猜你喜欢
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2016-04-10
      • 2017-04-25
      • 1970-01-01
      相关资源
      最近更新 更多