繁体   English   中英

去掉 <soapenv:Header> 从XML路由中的有效负载

[英]Remove <soapenv:Header> from payload in XML route

我正在寻找解决方案,该方法如何使用基于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_"/>但是我无法找出正确的“内容”,或者此命令仅适用于有效负载部分上方的标头...

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

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

然后,您可以使用envelop标签重构您的消息。

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

仅当您的信封标签为常数时,此方法才有效。

我最简单的方法是解析SOAP消息,然后删除标头。 您可以使用SAAJ做到这一点。 如何从SOAP消息中删除空标题?

.removeHeaders()用于删除完全不同的Camel交换标题。

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

为什么对XSLT不满意?

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

因此,我找到了解决问题的完美且非常简单的解决方案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM