【发布时间】:2015-08-19 07:53:49
【问题描述】:
我需要通过中间件调用外部 Web 服务,我的有效负载中的一个标签包含嵌入式 XML。下面的示例有效负载和序列 sn-p。我遇到以下问题。
场景 1:(第 24 行)表达式="get-property('PayloadXML')" - 发出发送命令后,无法识别 Web 服务方法。
场景 2 : (line 24) expression="get-property('lPayload')" - 发出发送命令后,成功调用 web 服务方法。然而,为了让目标系统成功处理消息,它需要处理 CDATA 元素(包装)。
当尝试通过soapUI 调用场景2 时,该过程是成功的。根据我的研究 (Passing CDATA in WSO2),soapUI 似乎在转发消息之前在内部处理 CDATA 元素。
现在,我知道我设置场景 2 的方式并不理想(更像是一种 hack),但我不知道有任何其他方法可以实现这一点。我已经阅读了许多博客/帖子,并尝试通过 XSLT 调解器转换(开发)有效负载,但没有成功。我也遇到过以下帖子 http://www.yenlo.com/en/how-to-preserve-a-cdata-in-xml-that-is-circulating-in-a-wso2-enterprise-service-bus/ ,但我似乎找不到所引用的补丁。
所以我的问题如下: 1. 有没有其他方法/机制可以达到我的要求? 2. WSO2 ESB 4.9.0 版本会解决上述问题吗?
样本负载:
<sample><test>MyData</test></sample>
序列片段:
<property xmlns:ns1="http://ws.wso2.org/dataservice"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
name="PayloadXML"
expression="$body/data-services-event/content/ns1:return/ns1:return/ns1:PayLoadXML"/>
<property xmlns:ns="http://org.apache.synapse/xsd"
name="lPayload"
expression="fn:concat(fn:concat('<![CDATA[',get-property('PayloadXML')), ']]>')"/>
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:log="http://mynamespace">
<soapenv:Header/>
<soapenv:Body>
<log:publishMessage>
<Payload xmlns="">$1</Payload>
</log:publishMessage>
</soapenv:Body>
</soapenv:Envelope>
</format>
<args>
<arg xmlns:ns2="http://org.apache.synapse/xsd"
xmlns:ns="http://org.apache.synapse/xsd"
evaluator="xml"
expression="get-property('lPayload')"/>
</args>
</payloadFactory>
【问题讨论】: