我正在尝试在ESB中编写一个序列,并使用有效负载工厂填充我的有效负载数据,如下所示。
<payloadFactory>
<format>
<p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
<in xmlns="">$1</in>
</p:echoInt>
</format>
<args>
<arg xmlns:ns="http://org.apache.synapse/xsd" expression="an-xml-formatted-string"/>
</args>
</payloadFactory>
<send>
<endpoint>
<address uri="http://noon101:8280/services/echo" format="soap11"/>
</endpoint>
</send>
因为当我将此有效负载发送到服务时,我的字符串被格式化为xml,服务尝试解析我的xml参数并且(我不明白究竟是什么原因)我的Web服务方法未被调用。在这个link中它说如果我使用cdata而不是解析器将不解析我的xml格式的字符串,那就没有问题了。
但问题是Payload Factory介体在其内容中不接受Cdata。当我编写如下所示的Payload Factory配置时,它会从中删除CDATA关键字并且问题在于。
<payloadFactory>
<format>
<p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
<in xmlns=""> <![CDATA[ $1 ]]> </in>
</p:echoInt>
</format>
<args>
<arg xmlns:ns="http://org.apache.synapse/xsd" expression="an-xml-formatted-string"/>
</args>
</payloadFactory>
这个问题的解决方案是什么?任何其他设置有效载荷或任何变通方法的调解员将不胜感激。
答案 0 :(得分:5)
您可以在有效负载工厂介体中使用CDATA。您需要做的唯一事情是,您需要将格式存储在注册表中并从那里使用它。 Registry Resource
以下是一个示例。在此示例中,我使用我之前调用的响应作为我正在准备有效负载工厂介体的消息的输入。
<property xmlns:ns="http://org.apache.synapse/xsd"
name="ALLRESULTS"
expression="$body/child::*[fn:position()=1]"
scope="default"
type="STRING"/>
<payloadFactory media-type="xml">
<format key="conf:/repository/esb/myPF"/>
<args>
<arg evaluator="xml" expression="$ctx:ALLRESULTS"/>
<arg value="1"/>
</args>
</payloadFactory>
注册表资源的内容如下。
<ns:testMethod xmlns:ns="http://example.com">
<xs:xmlBody xmlns:xs="http://example.com"><![CDATA[$1]]></xs:xmlBody>
<xs:sessionId xmlns:xs="http://example.com">$2</xs:sessionId>
</ns:testMethod>
通过这种方式,您可以在有效负载工厂介体中使用CDATA。
答案 1 :(得分:3)
您可以使用XSLT介体(Payload工厂介体不支持CDATA)。但是如果你使用它。此外,您还需要执行以下配置以在中介流中保留CDATA。 [1]
这也会有所帮助。 http://tharindumathew.com/2012/05/24/adding-cdata-tags-through-xslt/
[1] http://blog.shelan.org/2013/03/how-to-send-cdata-inside-your-soap.html
答案 2 :(得分:0)
如果要传递CDATA,可以使用XSLT介体构建此类消息。 Payload工厂,AFAIK不支持CDATA参数。