首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wso2esb迭代wso2dss结果

wso2esb迭代wso2dss结果
EN

Stack Overflow用户
提问于 2017-01-27 07:29:20
回答 1查看 640关注 0票数 0

我想写下一个目标操作序列: 1.调用DSS接收客户列表;2.通过单独调用另一个DSS服务丰富每个客户的服务。

所以,我想我应该调用callout中介,然后使用迭代器迭代它的结果。但是我不明白我应该在迭代器中写什么。

还有另一个问题--我说得对吗?每一次迭代的结果都会附加在“customer”标签下吗?

详细信息:

下一个是从DSS返回的XML:

代码语言:javascript
复制
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <customers xmlns="crm.crm.crm">
         <customer>
            <customerId>1</customerId>
            <name>Customer #1</name>
            <birthdate>2017-01-15T14:54:12.000+03:00</birthdate>
         </customer>
      </customers>
   </soapenv:Body>
</soapenv:Envelope>

顺序:

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
<sequence name="BatchSequence" statistics="enable" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <log description="">
        <property name="text" value="Start batch seq"/>
    </log>
    <payloadFactory description="create dss request" media-type="xml">
        <format>
            <soapenv:Envelope xmlns:crm="crm.crm.crm" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                <soapenv:Header/>
                <soapenv:Body>
                    <crm:getCustomers>
                        <crm:batchSize>3</crm:batchSize>
                    </crm:getCustomers>
                </soapenv:Body>
            </soapenv:Envelope>
        </format>
        <args/>
    </payloadFactory>
    <callout action="urn:getCustomers" description="dss: main object" initAxis2ClientOptions="false" serviceURL="http://192.168.3.32:9765/services/CrmDataService?wsdl">
        <source type="envelope"/>
        <target key="customers"/>
    </callout>
    <log description="">
        <property expression="get-property('customers')" name="text"/>
    </log>
    <iterate description="Enrich customers" expression="/soapenv:Envelope/soapenv:Body/customers/customer" id="iterateId" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <target>
            <sequence>
                <property description="customerId" expression="/customerId" name="customerID" scope="default" type="STRING"/>
                <log description="">
                    <property expression="get-property('customerID')" name="text"/>
                </log>
            </sequence>
        </target>
    </iterate>
    <log description="">
        <property name="text" value="End batch seq"/>
    </log>
</sequence>

产出:

2017-01-27 10:17:17 371 INFO - LogMediator To:,MessageID: LogMediator :LogMediator,text = Start batch seq 2017-01-27 10:17:18,558 INFO -LogMediator To:,MessageID: LogMediator: request,文本=1 1Customer #12017-01-15T14:54:12.000+03:002 1Customer#22016-12-16T14:54:20.000+03:003 1Customer #32016-10-27T14:54:21.000+03:00 2017-01-27 10:00 2017-01 10:17:18 559警告- RuntimeStatisticCollector事件在事件收集完成后发生,事件- urn_uuid_d628e361-beb8-4c26-b06d-3901227ad7 6a231160071781262

更新1一些工作代码。不确定这是否正确,因为我有点困惑于这里的PayloadFactory。

代码语言:javascript
复制
<payloadFactory description="" media-type="xml">
    <format>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>$1</soapenv:Body>
        </soapenv:Envelope>
    </format>
    <args>
        <arg evaluator="xml" expression="get-property('customers')"/>
    </args>
</payloadFactory> 
<iterate continueParent="true" description="" expression="$body/crm:customers/crm:customer" sequential="true" xmlns:crm="crm.crm.crm">
    <target>
        <sequence>
            <property expression="//crm:customerId" name="customerID" scope="default" type="STRING"/>
            <log>
                <property expression="get-property('customerID')" name="text"/>
            </log>
        </sequence>
    </target>
</iterate>

更新2我发现了一个主要的问题--标注中介没有将响应放到信封上下文中(如果我理解正确的话)。因此,我们不能只使用属性将其与迭代器链接,因此,在这种情况下,我们应该使用smth (比如Payload工厂)将它们链接起来。不是很难看,如果smbdy知道如何做到更简单(dirrect将属性传递给迭代器)--请写信给我。解决方案-使用电话会议。效果很好。

感谢大家!

EN

回答 1

Stack Overflow用户

发布于 2017-01-27 08:34:56

dss响应中的xml节点属于名称空间"crm.crm.crm“,您必须在xpath中引用它。

使用迭代中介器,如果您希望保留源有效负载,则必须使用名为preservePayload="true“的属性,并指出xml框架必须与属性attachPath附加在哪里,或者在interate的序列中,您只能将xml片段放在soap主体中。

这是一个在不保留源有效负载的情况下工作的示例:

代码语言:javascript
复制
    <iterate xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:crm="crm.crm.crm" expression="$body/crm:customers/crm:customer" id="iterateId">
        <target>
            <sequence>
                <property expression="$body/crm:customer/crm:customerId" name="customerID" scope="default" type="STRING"/>
                <log>
                    <property expression="get-property('customerID')" name="text"/>
                </log>
            </sequence>
        </target>
    </iterate>

默认情况下,迭代后的中介程序不会被执行。如果要继续中介,请使用属性continueParent="true“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41888871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档