序列标注到DS无法解析响应

时间:2016-05-11 19:48:07

标签: wso2 wso2esb wso2dss

我有一个问题来解析dss的callout响应。 我有2台服务器

  • WSO2 ESB服务器(4.9.0)
  • 安装了数据服务(4.3.4)功能的WSO2 Application Server(5.3.0)

我制作有效载荷

<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>

3 个答案:

答案 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"/>