我正在寻找解决方案如何使用基于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_"/>
,但要么我找不到正确的“某事”,要么此命令仅适用于有效负载部分以上的标题......
答案 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>