我有一个有多个操作的后端服务。 (例如,echoInt和echoString)。我想用预定义的变量(在inSequence中)用 PayloadFactory 中介替换它们的输入值。 如何为不同的操作定义payloadfactory? 当我为每个人定义两个payloadfactory中介时,只有最后一个中介为它的操作工作。当我调用其他opertaion时,会出现此错误:
wso2 namespace mismatch
operation1:
<p:echoString xmlns:p="http://echo.services.core.carbon.wso2.org">
<in>$1</in>
</p:echoString>
操作2:
<p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
<in>$1</in>
</p:echoInt>
我的inSequense:
<inSequence>
<payloadFactory media-type="xml">
<format>
<p:echoString xmlns:p="http://echo.services.core.carbon.wso2.org">
<in xmlns="">teststr</in>
</p:echoString>
</format>
<args/>
</payloadFactory>
<payloadFactory media-type="xml">
<format>
<p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
<in xmlns="">1111</in>
</p:echoInt>
</format>
<args/>
</payloadFactory>
</inSequence>
以上inSequense,两个操作的输出结果是&#39; 1111&#39;:
<ns:echoStringResponse xmlns:ns="http://echo.services.core.carbon.wso2.org">
<return>1111</return>
</ns:echoStringResponse>
提前致谢
答案 0 :(得分:0)
第二个Payload工厂取代了第一个。 如果要在不同的情况下使用它们,则应在Switch中介中定义它们。
您可以使用属性来获取定义应使用哪种情况的输入,然后使用正则表达式匹配属性值。或者您可以跳过该属性并在Switch源中输入表达式。
最后它看起来类似于:
<inSequence>
<property expression="/default/expression" name="input_string" scope="default" type="STRING"/>
<switch source="get-property('input_string')">
<case regex="[\w\s]+">
<payloadFactory media-type="xml">
<format>
<p:echoString xmlns:p="http://echo.services.core.carbon.wso2.org">
<in xmlns="">teststr</in>
</p:echoString>
</format>
<args/>
</payloadFactory>
</case>
<default>
<payloadFactory media-type="xml">
<format>
<p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
<in xmlns="">1111</in>
</p:echoInt>
</format>
<args/>
</payloadFactory>
</default>
</switch>
<respond/>
</inSequence>
答案 1 :(得分:0)
如果你想同时调用两个操作,你应该使用克隆或迭代Mediator,并在后面使用聚合Mediator。
你使用两个payloadFactory的原因,只有最后一个工作,是一个请求只有一个消息上下文,这意味着,你只能同时向后端发送一个soap消息。这意味着最后一个payloadFactory将覆盖第一个。
克隆或迭代Mediator会将一个消息上下文克隆或拆分为多个消息上下文,然后您可以向后端服务发送多个soap消息。由于您有多个消息上下文,因此您应该使用聚合Mediator在后端服务返回结果后将这些多个响应聚合到一个消息上下文中。