mule3 到 mule 4 表达式到 dataweave 2.0

Posted

技术标签:

【中文标题】mule3 到 mule 4 表达式到 dataweave 2.0【英文标题】:mule3 to mule 4 expression to dataweave 2.0 【发布时间】:2021-10-16 13:26:51 【问题描述】:

我是迁移 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);

【问题讨论】:

您遇到了什么问题、一些错误或其他问题?变量的类型有哪些? 在回答任何问题时,添加示例输入和预期输出也会有所帮助。 【参考方案1】:

在 Mule 3 中,表达语言是 MEL。在 Mule 4 中,它是 DataWeave 2.0。你不能直接翻译。 MEL 是一种命令式脚本语言,类似于 Java 的一个子集,很容易调用 Java 方法。 DataWeave 2.0 是一种函数式语言。此外,Mule 4 操作(例如:a 、 等)只能返回一个值,该值可以分配给有效负载或一个变量。

对于您的 sn-p,我假设 maindata 是一张地图。您可以使用两个 set-variable 来分配每个变量:

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

我不知道你对以前的数据使用什么。

要更新变量 maindata,它可能很适合 update operator,在单独的或转换操作中,条件与 vars.temporary 相同。

更新: 我假设 vars.maindata 是一个映射,DataWeave 将其视为一个对象,并且每个元素都是一个列表。作为使用dynamic selector 执行'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 var temporary 替换为我上面示例中的表达式,并将其他 DataWeave 变量替换为 Mule 变量 (vars.name) 或有效负载。如果您将上面示例中的 myKey 更改为具有值“b”,您将看到该键被添加。

【讨论】:

我也需要在 else 块中将 vars.maindata.payload.idCaseNumber 更新为临时 您需要一个单独的集合变量转换及其自己的 if 表达式。请详细阅读我的回答。如果您提供有关该问题的更多详细信息,我可能会完善答案。 使用问题的 cmets 中要求的信息来完成详细信息。 我根据我从您的代码中做出的一些假设,用一个试探性的例子更新了答案。

以上是关于mule3 到 mule 4 表达式到 dataweave 2.0的主要内容,如果未能解决你的问题,请参考以下文章

mule3 sftp:输入端点编码

在 mule3 webservice 中调用子流

将 JSON 格式的文件发送到 Mule 3.8 中的 REST 服务

Mule 3 HTML 作为属性值

Mule 3.3 spring 3.1 hibernate 3.6 事务管理

Mule 中的 ActiveMQ 负载均衡