[英]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.