在有效负载中替换值

时间:2016-09-16 10:06:15

标签: mule anypoint-studio

我有一个带有两个参数的XML消息,用于调用REST服务端点。但是,如果它们中的任何一个是某个值,我想在通话之前更改它们,例如

<Interface Server="ABC" Server2="DEF"/>

如果其中任何一个具有值“ABC”,则应始终将其替换为“BC”,并且在我对REST服务的调用中,我将在上面的示例中发送param1 =“BC”和param2 =“DEF”。 我正在考虑选择路由器并检查服务器是否为“ABC”然后设置流量变量param1 =“BC”然后我意识到如果那个是“ABC”,我将不得不再次为Server2做同样的事情......这感觉就像..它必须是一种更简单的方法来实现这一目标? 我对吗?我是否可以使用一些聪明的MEL或XPATH3表达式来总是将值替换为“BC”,如果它们中的任何一个是“ABC”?

此致

1 个答案:

答案 0 :(得分:2)

您可以尝试以下配置:

<enricher doc:name="Message Enricher">
    <dw:transform-message doc:name="Transform Message">
    <dw:set-payload><![CDATA[%dw 1.0
%output application/java
%var evaluation = "ABC"
%var substitution = "BC"
%function substitute(serverVal)(
    serverVal when serverVal != evaluation otherwise substitution
)
---
payload.Interface.@ mapObject {
    ($$): substitute($)
}
]]></dw:set-payload>
    </dw:transform-message>
    <enrich source="#[payload.Server]" target="#[variable:param1]"/>
    <enrich source="#[payload.Server2]" target="#[variable:param2]"/>
</enricher>

无论XML源中有多少属性,您只需要相应地添加richher元素。

例如,您有一个新的XML源:<Interface Server="ABC" Server2="DEF" Server3="ABC"/>

然后您只需添加:<enrich source="#[payload.Server3]" target="#[variable:param3]"/>来设置新变量。

注意: DataWeave EE 功能之一。对于 CE ,您可以将其替换为其他变换器,例如:Groovy。在下面的示例中,有效内容采用String的形式。原始application / xml格式使用byte-array-to-string-transformer转换为String。

<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[def attributeMap = new XmlSlurper().parseText(payload).attributes()

attributeMap.each() {
    it.value = it.value == "ABC" ? "BC" : it.value
}

payload = attributeMap]]></scripting:script>
</scripting:component>