【问题标题】:WS02 Enrich mediator after end point callWS02 端点调用后丰富中介
【发布时间】:2018-02-06 08:22:22
【问题描述】:

我正在尝试使用丰富中介来填充来自端点的自定义响应

我的序列

<sequence name="GetMySqlData" trace="disable" xmlns="http://ws.apache.org/ns/synapse">

    <enrich description="AddProductData">
        <source clone="true" type="inline">
            <ProductDataMySqlDB xmlns="">
                <code/>
                <name/>
                <description/>
                <qty/>
            </ProductDataMySqlDB>
        </source>
        <target action="child" xpath="//mediate"/>
    </enrich>
    <property expression="$ctx:ProductCode" name="code" scope="default" type="STRING"/>

    <payloadFactory media-type="xml">
        <format>
            <soapenv:Envelope xmlns:dat="http://ws.wso2.org/dataservice" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                <soapenv:Header/>
                <soapenv:Body>
                    <dat:getInventoryByCode>
                        <dat:code>$1</dat:code>
                    </dat:getInventoryByCode>
                </soapenv:Body>
            </soapenv:Envelope>
        </format>
        <args>
            <arg evaluator="xml" expression="get-property('code')"/>
        </args>
    </payloadFactory>
    <property name="HTTP_METHOD" scope="axis2" type="STRING" value="POST"/>
    <property name="SOAPAction" scope="transport" type="STRING" value="getInventoryByCode"/>
    <call>
        <endpoint key="getInventoryByCode"/>
    </call>

--PROBLEMS STARTS ---
    <enrich description="code">
        <source clone="true" xpath="//Entry/code"/>
        <target xpath="//mediate/ProductDataMySqlDB/code"/>
    </enrich>
    <enrich description="name">
        <source clone="true" xpath="//Body/Entries/Entry/name"/>
        <target xpath="//mediate/ProductDataMySqlDB/name"/>
    </enrich>
    <enrich description="description">
        <source clone="true" xpath="//Entries/Entry/description"    />
        <target xpath="//mediate/ProductDataMySqlDB/description"/>
    </enrich>
    <enrich description="qty">
        <source clone="true" xpath="//m0:Entries/m0:Entry/m0:qty"  xmlns:m0="http://ws.wso2.org/dataservice" />
        <target xpath="//mediate/ProductDataMySqlDB/qty"/>
    </enrich>
    <log level="full">
        <property expression="$body" name="MySQLResponse"/>
    </log>
    <loopback/>
</sequence>

我得到表单端点的响应就像

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <Entries xmlns="http://ws.wso2.org/dataservice">
         <Entry>
            <code>PR2</code>
            <name>Product2</name>
            <description>Product stored in MySQL</description>
            <qty>-2</qty>
         </Entry>
      </Entries>
   </soapenv:Body>
</soapenv:Envelope>

日志中的错误是: 找不到 xpath 指定的节点。 {org.apache.synapse.mediators.elementary.EnrichMediator} 无法丰富来自空源的消息。 {org.apache.synapse.mediators.elementary.EnrichMediator}

所以看起来我的源的 xpath 是错误的

<enrich description="code">
        <source clone="true" xpath="WHAT WOULD BE THE CORRECT PATH?"/>
        <target xpath="//mediate/ProductDataMySqlDB/code"/>
    </enrich>

谢谢

【问题讨论】:

  • 所以名为“GetMySqlData”的序列与对应于“我得到表单端点的响应”的输入消息一起工作,对吗?你在哪里看到一个名为“mediate”的节点?
  • 是的,我收到了来自 getInventoryByCode 端点的响应。关于“调解”......我的要求就像 PR2 ......所以最后的想法是我可以在“调解”下添加子元素' 元素 ...
  • 丰富中介的目标部分中使用的 xpath 必须引用当前消息中的现有节点
  • 我今天会尝试,但我仍然对部分“......无法丰富来自空源的消息......”感到困惑......我希望丰富的东西看到我的回复表单端点......我会让你知道

标签: wso2 wso2esb


【解决方案1】:

在您的消息中,“Entry”和“code”节点属于命名空间“http://ws.wso2.org/dataservice”(查看“Entries”根节点):您应该在源 xpath 中声明并使用此命名空间:

<source xmlns:ds="http://ws.wso2.org/dataservice" clone="true" xpath="//ds:Entry/ds:code"/>

【讨论】:

  • 第一个问题是我找到了 !!!!!! 并且现在(我相信)Im geting - 要丰富的无效目标对象......对于所有结果在有或没有 NS 时都是相同的
  • 也不应该像 ws.wso2.org/dataservice" clone="true" xpath="//ds:Entries/Entry/code"/ 因为只有 Entries 有 ns 属性?
  • 还在 ESB 中添加额外的 ns ?org.apache,synapse/xsd? ws.wso2.org/dataservice" xmlns:ns="org.apache.synapse/xsd" xpath="//ds:Entries/Entry/code"/>
  • 您的目标问题是因为我猜您的消息中没有名为“mediate”的节点,因此您无法在不存在的节点下注入 xml 节点。关于命名空间,也许您需要在丰富节点上定义它。关于默认突触命名空间,您不必照顾它
  • 以防 并像我得到收入数据一样记录它 = PR2 (我删除了中间元素)但如果我使用 org.apache.synapse/xsd" xpath="//ProductCode"/> RegCode 中没有值? ???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 2018-11-18
  • 1970-01-01
  • 2022-07-18
  • 2019-08-26
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多