我有一个问题来解析dss的callout响应。 我有2台服务器
我制作有效载荷
<payloadFactory description="Payload Processed" media-type="xml">
<format>
<p:archivoProcesado xmlns:p="MyDataService">
<xs:archivo xmlns:xs="MyDataService">$1</xs:archivo>
</p:archivoProcesado>
</format>
<args>
<arg evaluator="xml" expression="get-property('filename')" />
</args>
</payloadFactory>
之后我打了一个标注
<callout action="archivoProcesado" description="Callout ArchivoProcesado"
initAxis2ClientOptions="false"
serviceURL="http://192.168.0.33:9764/services/MyDataService?wsdl">
<source xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:s12="http://www.w3.org/2003/05/soap-envelope"
xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]" />
<target xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:s12="http://www.w3.org/2003/05/soap-envelope"
xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]" />
</callout>
测试我的结果:
<log level="custom">
<property expression="$body/*" name="RTA" />
</log>
并且:
LogMediator RTA = <ArchivosProcesados xmlns="MyDataService"><ArchivoProcesado><procesado>1</procesado></ArchivoProcesado></ArchivosProcesados>
但是当我想解析回复时我不能
<log level="custom">
<property expression="//ArchivosProcesados/ArchivoProcesado/procesado/text()"
name="count" />
</log>
<log level="custom">
<property expression="//ArchivosProcesados" name="xxx" />
</log>
<log level="custom">
<property expression="//ArchivosProcesados/*" name="yyy" />
</log>
并且日志为空白
INFO - LogMediator count =
INFO - LogMediator xxx =
INFO - LogMediator yyy =
我怎样才能获得价值?我做错了什么?
MyDSS
<query id="archivoProcesado" useConfig="MyDataService">
<sql>select count(1) as procesado from auto_procesados where archivo = ?</sql>
<param name="archivo" ordinal="1" paramType="SCALAR" sqlType="STRING" type="IN"/>
<result element="ArchivosProcesados" rowName="ArchivoProcesado">
<element column="procesado" name="procesado"/>
</result>
</query>
<operation name="archivoProcesado">
<call-query href="archivoProcesado">
<with-param name="archivo" query-param="archivo"/>
</call-query>
</operation>
答案 0 :(得分:0)
尝试将xmlns属性添加到属性介体。
<log level="custom">
<property xmlns="MyDataService" expression="//ArchivosProcesados/ArchivoProcesado/procesado/text()"
name="count" />
</log>
JP
答案 1 :(得分:0)
在ESB 4.9.0中,我们已经删除了标注调解员。那么请你使用call blocking [1]和[blocking =“true”]代替。如果它不起作用,请按照[2]启用wirelogs,并检查您是否正确地从DSS端点获得响应。调用中介配置示例如下。
<call blocking="true">
<endpoint>
<address format="soap12" uri="http://192.168.0.33:9764/services/MyDataService"/>
</endpoint>
</call>
此外,当您从DSS获取数据时,所有数据都属于以下名称空间。 http://ws.wso2.org/dataservice。您必须为该命名空间定义名称空间前缀,并在xpath表达式中使用它。下面给出一个例子。
<log level="custom">
<property xmlns:x="http://ws.wso2.org/dataservice" expression="//x:ArchivosProcesados/x:ArchivoProcesado/x:procesado/text()"
name="count" />
</log>
[1] https://docs.wso2.com/display/ESB490/Call+Mediator
[2] http://mytecheye.blogspot.com/2013/09/wso2-esb-all-about-wire-logs.html
答案 2 :(得分:0)
首先,我通过阻止调用来更改标注。
之后我将messageType更改为json
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
然后通过json-eval访问
<property expression="json-eval($.ArchivosProcesados.ArchivoProcesado.procesado)"
name="count" scope="default" type="STRING"/>
最后我将消息类型备份到xml:
<property name="messageType" scope="axis2" type="STRING" value="text/xml"/>