对 DS 的序列标注无法解析响应

Sequence Callout to DS cant parse response

我在解析 dss 的标注响应时遇到问题。 我有 2 个服务器

我做了一个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"/>