从XML路由中的有效负载中删除<soapenv:header>

时间:2016-06-22 12:55:07

标签: java xml soap apache-camel blueprint-osgi

我正在寻找解决方案如何使用基于XML的路由(Apache Camel Blueprint XML)从SOAP请求中删除<soapenv:Header>部分。

所以这个:

<soapenv:Envelope xmlns:net="..." xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
      ...
   </soapenv:Header>
   <soapenv:Body>
      ...
   </soapenv:Body>
</soapenv:Envelope>

将成为这样:

<soapenv:Envelope xmlns:net="..." xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      ...
   </soapenv:Body>
</soapenv:Envelope>

我认为我找到了基于java的解决方案,也是基于xslt的解决方案,但我发现它们不适合我的项目,我仍然希望有一些简单的方法如何直接在XML路由中完成它而不创建java处理类或添加XSLT模板。

我正在尝试<removeHeaders pattern="_something_"/>,但要么我找不到正确的“某事”,要么此命令仅适用于有效负载部分以上的标题......

4 个答案:

答案 0 :(得分:1)

在Blueprint中,您可以使用XPATH获取XML的主体。像这样:

<setProperty propertyName="MessageBody">
    <xpath>//*[local-name()='Body']</xpath>
</setProperty>

然后,您可以使用信封标记重建消息。

<setBody>           
    <simple><![CDATA[<Envelope>${property.MessageBody}</Envelope>]]></simple>
</setBody>

这仅在您的Envelope标记为常量时才有效。

答案 1 :(得分:0)

我最简单的方法是解析SOAP消息,然后删除标题。你可以用SAAJ做到这一点。 How to remove empty header from SOAP message?

.removeHeaders()用于删除Camel交换标头,这是完全不同的。

答案 2 :(得分:0)

这取决于您为CXF端点使用的数据格式,此SOAP请求是否来自其他服务?

为什么你对XSLT不满意?

无论如何,如果使用有效负载DATAFORMAT,则可以删除。

答案 3 :(得分:0)

所以我找到了解决问题的完美而简单的方法:

<soapenv:Header>的内容(以及<soapenv:Body>的内容)存储在CxfPayload对象中,该对象是org.apache.camel.Exchange的一部分

在我了解到这一点后,我只是一个 Groovy 命令,可以很容易地包含在routes.xml中,远离解决方案:

<groovy>
    exchange.getIn().getBody(org.apache.camel.impl.DefaultMessage.class).getBody(org.apache.camel.component.cxf.CxfPayload.class).getHeaders().clear();
</groovy>