2016-09-16 49 views
1

我有一个XML消息,其中包含两个用于调用REST服务端点的参数。但是,如果任何人都一定值时,我想我的电话之前改变它们,例如有效负载中的替换值

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

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

问候

回答

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 
) 
--- 
[email protected] mapObject { 
    ($$): substitute($) 
} 
]]></dw:set-payload> 
    </dw:transform-message> 
    <enrich source="#[payload.Server]" target="#[variable:param1]"/> 
    <enrich source="#[payload.Server2]" target="#[variable:param2]"/> 
</enricher> 

不管如何在XML源很多属性,你只需要添加相应的富集元素。

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

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

备注:DataWeaveEE功能之一。对于CE,您可以将其替换为其他变压器,例如:Groovy。在下面的例子中,有效载荷是以String的形式出现的。使用byte-array-to-string-transformer将原始应用程序/ xml格式转换为字符串。

<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> 
+0

不错的办法,我给一个去 – elwis

+0

嗯,我得到的SAXParser例外情况是,只有DataWeave - 因为我跑CE? – elwis

+0

* DataWeave *是** EE **功能之一。我更新了使用Groovy作为替换的答案。 –