【问题标题】:Iteration through Parent-child with endpoint call使用端点调用通过父子迭代
【发布时间】:2018-11-13 10:11:34
【问题描述】:

场景:请求包含多个带有详细信息的订单。将订单详细信息发送到后端服务并获取一个新的行号,之后我应该像使用创建详细信息的参数之一一样使用它

请求外观:

<OrderList>
        <Order>
            <target>MySQL</target>
            <Sales>
                <email>p@gmail.com</email>
            </Sales>
            <Details>
                <Item><qty>1</qty><code>PR9</code></Item>
                <Item><qty>2</qty><code>PR8</code></Item>
                <Item><qty>3</qty><code>PR7</code></Item>
            </Details>
        </Order>
        <Order>
            <target>MySQL</target>
            <Sales>
                <email>j@gmail.com</email>
            </Sales>
            <Details>
                <Item><qty>4</qty><code>PR6</code></Item>
                <Item><qty>5</qty><code>PR5</code></Item>
                <Item><qty>6</qty><code>PR4</code></Item>
            </Details>
        </Order>
        .......
   </OrderList> 

顺序:

                <inSequence>
            <!--  get source target data -->
            <iterate expression="//Order" preservePayload="true">
                <target>
                        <enrich>
                            <source clone="true" xpath="//Order"/>
                            <target property="OrderBackup" type="property"/>
                        </enrich>
                    <sequence>
                        <property expression="//target" name="SalesTarget" scope="default" type="STRING"/>
                        <property expression="//Sales/email" name="email" scope="default" type="STRING"/>
                        <filter regex="MySQL" source="$ctx:SalesTarget">
                            <then>

                                <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:addSalesOrder>
                                                    <dat:email>$1</dat:email>
                                                </dat:addSalesOrder>
                                            </soapenv:Body>
                                        </soapenv:Envelope>
                                    </format>
                                    <args>
                                        <arg evaluator="xml" expression="$ctx:email"/>
                                    </args>
                                </payloadFactory>
                                <call blocking="true">
                                    <endpoint key="SalesOrderEP"/>
                                </call>
                                **<enrich>
                                    <source clone="true" type="body"/>
                                    <target property="newRowID" type="property"/>
                                </enrich>**

                                <property expression="$ctx:newRowID > 0 " name="isCorrectResponse" scope="default" type="BOOLEAN"/>
                                <filter regex="true" source="$ctx:isCorrectResponse">
                                    <then>
                                       <enrich>
                                        <source clone="true" property="OrderBackup" type="property"/>
                                        <target type="body"/>
                                    </enrich>
                                        <iterate expression="//Details">
                                            <target>
                                                <sequence>
                                                    <property expression="//qty" name="qty" scope="default" type="STRING"/>
                                                    <property expression="//code" name="code" scope="default" type="STRING"/>
                                                    <log level="custom">
                                                        <property expression="fn:concat('params:Code: ' ,$ctx:code, ' ;Qty: ',$ctx:qty)" name="info"/>
                                                    </log>
                                                    <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:addSalesDetails>
                                                                        <dat:salesId>$1</dat:salesId>
                                                                        <dat:qty>$2</dat:qty>
                                                                        <dat:code>$3</dat:code>
                                                                    </dat:addSalesDetails>
                                                                </soapenv:Body>
                                                            </soapenv:Envelope>
                                                        </format>
                                                        <args>
                                                            <arg evaluator="xml" expression="$ctx:newRowID"/>
                                                            <arg evaluator="xml" expression="$ctx:qty"/>
                                                            <arg evaluator="xml" expression="$ctx:code"/>
                                                        </args>
                                                    </payloadFactory>
                                                    <call blocking="true">
                                                        <endpoint key="SalesDetailsEP"/>
                                                    </call>
                                                    <!--  get response and log it  -->
                                                    <aggregate>
                                                        <completeCondition>
                                                            <messageCount max="-1" min="-1"/>
                                                        </completeCondition>
                                                        <onComplete expression="//m0:UpdatedRowCount/Value" xmlns:m0="http://ws.wso2.org/dataservice">
                                                            <log level="full"/>
                                                            <drop/>
                                                        </onComplete>
                                                    </aggregate>
                                                </sequence>
                                            </target>
                                        </iterate>
                                    </then>
                                    <else/>
                                </filter>
                            </then>
                            <else/>
                        </filter>
                    </sequence>
                </target>
            </iterate>
        </inSequence>

我的第一个呼叫响应有问题...我使用了

<enrich>
      <source clone="true" type="body"/>
       <target property="newRowID" type="property"/>
</enrich>

将新创建的行 ID 保存在属性中,并且我在行中正确获取它

> <log level="custom">
> <property expression="fn:concat('NewRowID = ' ,$ctx:newRowID)" name="info"/>
> </log>

但是当我想在第二个有效负载中使用它时,它看起来无法解决它?!!?

错误:

DS 故障消息:“CallQuery.extractParams”中的错误,找不到 参数类型:查询参数名称:salesId DS 代码: INCOMPATIBLE_PARAMETERS_ERROR

我发现在有效负载中 $ctx:newRowID 被解析为

  <GeneratedKeys> xmlns="http://ws.wso2.org/dataservice"><Entry><ID>93</ID></Entry></GeneratedKeys>

而不仅仅是93

我猜这是因为在丰富中我使用源作为“正文”..但是当我试图获得响应的 xpath 时,如 xpath = "//Entry/ID" 我什么也没得到

怎么了?

【问题讨论】:

  • 我找到了一个解决方案,用 保留消息的原始部分 但现在我有问题要保留 newRowID 并将其作为详细消息的一部分发送
  • 真正的问题也是为什么当我向端点发送呼叫并尝试将响应保存在属性中它不起作用???我的响应就像 ws.wso2.org/dataservice" clone="true" xpath="//n0:GeneratedKeys/Entry/ID"/>错误是找不到xpath

标签: wso2 wso2esb


【解决方案1】:

问题是丰富的中介需要命名空间,所以

<enrich>
   <source clone="true" xmlns:n0="http://ws.wso2.org/dataservice" xpath="$body/n0:GeneratedKeys/n0:Entry/n0:ID"/>
   <target property="newRowID" type="property"/>
</enrich>

做了魔法......所以总是把一个命名空间的经验教训放在一边

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2015-11-12
    • 2017-02-01
    • 2011-05-26
    相关资源
    最近更新 更多