从 XML 路由中的负载中删除 <soapenv:Header>

Remove <soapenv:Header> from payload in XML route

我正在寻找如何使用 XML-based 路由(Apache Camel 蓝图 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-based 解决方案,还有 xslt-based 解决方案,但我觉得它们不太适合我的项目,我仍然希望有一些简单的方法可以直接在XML 路由而不创建 java 处理 class 或添加 XSLT 模板。

我正在尝试 <removeHeaders pattern="_something_"/> 但我无法找出正确的 "something",或者此命令仅适用于负载部分上方的 headers...

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

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

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

为什么您对 XSLT 不满意?

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

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

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

然后您可以使用信封标签重构您的消息。

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

只有当您的 Envelope 标签是常量时,这才有效。

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

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