我刚开始将mule 3应用程序迁移到mule 4,我已经完成了几乎转换,但一个表达式停止了我的流程,无法实现它的逻辑,如果有人有关于表达式转换的想法请帮助我
表达式:
if(flowVars.maindata.keySet().contains(payload.idCaseNumber))
{
flowVars.temporary=[];
flowVars.maindata.get(payload.idCaseNumber).add(map);
}
else
{
flowVars.temporary.add(previousdata);
vars.maindata.put(payload.idCaseNumber,temporary);
}
我已经尝试了我的知识在上面的代码,但仍然我得到的问题
flowVars.maindata.get(payload.idCaseNumber).add(map);
在Mule 3中,表达式语言是MEL。在Mule 4中,它是DataWeave 2.0。你不能直接翻译。MEL是一种命令式脚本语言,类似于Java的一个子集,它很容易调用Java方法。DataWeave 2.0是一种函数式语言。此外,Mule 4的操作(例如:a,等)只能返回一个值,该值可以分配给负载或一个变量。
对于您的代码片段,我假设maindata是一个映射。您可以使用两个set-variable来为每个变量赋值:
<set-variable variableName="temporary" value="#[ if( namesOf(vars.maindata) contains payload.idCaseNumber ) [] else vars.temporary ++ **previousdata** ]" />
我不知道你用什么来表示previousdata。
要更新变量maindata,它可能与更新操作符匹配得很好,在单独或转换操作中,条件与vars.temporary相同。
更新:我假设是var。maindata是一个映射,DataWeave将把它看作一个对象,每个元素是一个列表。下面是一个使用动态选择器执行'upsert'操作的示例:
%dw 2.0
output application/java
var temporary=[5]
var maindata={ a:[1,2,3,4] }
var myKey="a"
---
maindata update {
case data at ."$(myKey)"! -> if (data != null) data ++ temporary else temporary
}
您可以在上面的脚本中替换DataWeave变量temporary
与我上面的例子中的表达式,和其他DataWeave变量与Mule变量(vars.name
)或负载。如果你在上面的例子中改变myKey值"b"您将看到该键被添加。