对 DS 的序列标注无法解析响应
Sequence Callout to DS cant parse response
我在解析 dss 的标注响应时遇到问题。
我有 2 个服务器
- WSO2 ESB 服务器 (4.9.0)
- 安装了数据服务 (4.3.4) 功能的 WSO2 应用程序服务器 (5.3.0)
我做了一个payload
<payloadFactory description="Payload Processed" media-type="xml">
<format>
<p:archivoProcesado xmlns:p="MyDataService">
<xs:archivo xmlns:xs="MyDataService"></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 =
如何获取值?我做错了什么?
我的 DSS
<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>
尝试将 xmlns 属性添加到 属性 中介。
<log level="custom">
<property xmlns="MyDataService" expression="//ArchivosProcesados/ArchivoProcesado/procesado/text()"
name="count" />
</log>
日本
在 ESB 4.9.0 中,我们取消了标注调解器。那么,您能否改用调用调解器 [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 获取数据时,所有数据都属于以下名称 space。 http://ws.wso2.org/dataservice。您必须为该名称space 定义一个名称space 前缀,并在您的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
首先,我通过阻塞调用更改标注。
之后我将消息类型更改为 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"/>
我在解析 dss 的标注响应时遇到问题。 我有 2 个服务器
- WSO2 ESB 服务器 (4.9.0)
- 安装了数据服务 (4.3.4) 功能的 WSO2 应用程序服务器 (5.3.0)
我做了一个payload
<payloadFactory description="Payload Processed" media-type="xml">
<format>
<p:archivoProcesado xmlns:p="MyDataService">
<xs:archivo xmlns:xs="MyDataService"></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 =
如何获取值?我做错了什么?
我的 DSS
<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>
尝试将 xmlns 属性添加到 属性 中介。
<log level="custom">
<property xmlns="MyDataService" expression="//ArchivosProcesados/ArchivoProcesado/procesado/text()"
name="count" />
</log>
日本
在 ESB 4.9.0 中,我们取消了标注调解器。那么,您能否改用调用调解器 [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 获取数据时,所有数据都属于以下名称 space。 http://ws.wso2.org/dataservice。您必须为该名称space 定义一个名称space 前缀,并在您的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
首先,我通过阻塞调用更改标注。
之后我将消息类型更改为 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"/>