mule3 到 mule 4 表达式到 dataweave 2.0

mule3 to mule 4 expression to dataweave 2.0

我不熟悉将 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 、 等)只能 return 一个值,可以分配给有效负载或一个变量。

对于您的代码片段,我假设 maindata 是一张地图。您可以使用两个设置变量来分配每个变量:

<set-variable variableName="temporary" value="#[ if( namesOf(vars.maindata) contains payload.idCaseNumber ) [] else vars.temporary ++ **previousdata** ]" />

我不知道你以前的数据到底用什么。

要更新变量 maindata,它可能与 update operator 非常匹配,在单独或转换操作中,条件与 vars.temporary.

相同

更新: 我假设 vars.maindata 是一个地图,DataWeave 将其视为一个对象,并且每个元素都是一个列表。作为执行 'upsert' operation with a dynamic selector:

的示例
%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”,您将看到该密钥被添加。