<Mule - DataWeave> 引用变量名是动态的

<Mule - DataWeave> Reference to variables where the variable name is dynamic

您好,我想寻求有关 DataWeave 使用场景的帮助。

我需要检查是否存在卡名变量(卡名是动态的,无法事先预见)。
如果该变量已经存在,则将当前有效负载附加到该卡名称变量;
否则用当前有效载荷创建变量

问题是我不知道如何引用具有动态名称的变量。
我可以将当​​前的卡片名称保存到一个变量中,比如 "cardName",但之后如何在 DataWeave 代码中引用该变量?

伪下面是我想要实现的

请教实现方法?

您应该改用 Java 映射并使用 cardName 作为键。

好的,我可能没有 100% 理解问题,但我做了一个非常简单的流程来说明如果变量不存在则动态设置变量。希望能在一定程度上帮助你。这是我的完整流程

在设置的有效载荷中,我设置了一个虚拟有效载荷:

在接下来的转换消息中,我声明了一个直到那时才存在的变量卡,正如您在流程中看到的那样

最后在最后一个设置的有效载荷中,我将有效载荷设置为 vars.card hold

当我测试我的 API

时,我得到回复

现在如果你想动态地声明变量名和一些值我相信也可以做到。

您可以使用以下符号访问变量

vars[dynamic variable]

因为我不知道你的流程是什么样子,假设你有有效载荷,

{
  "data": [
    {
      "cardName": "cardName1",
      "dataToMap": "first data"
    },
    {
      "cardName": "cardName2",
      "dataToMap": "2nd data"
    },
    {
      "cardName": "cardName1",
      "dataToMap": "2nd data for card name 1"
    }
  ]
}

您可以遍历 payload.data(对每个使用)并将其映射为

%dw 2.0
output application/java

var varName = payload.cardName
---
if (vars[varName] != null)
    vars[varName] ++ "** **" ++ payload.dataToMap
else
    payload.dataToMap

并设置一个名称设置为 #[****] 的变量以动态选择变量。

最终结果将有两个名为 cardName1 和 cardName2 的变量,它们对应的值分别为 "first data** **2nd data for card name 1" 和“第二数据”。

这是在 For-Each 循环中使用 Set Variable 组件动态命名变量的示例流程。

这是在 For-Each 循环退出后保留数据的好方法,因为在调用 For-Each 作用域之前有效负载会重置为有效负载。

<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">
    <flow name="dynamic-varsFlow" >
        <scheduler doc:name="Scheduler"  >
            <scheduling-strategy >
                <fixed-frequency frequency="10000"/>
            </scheduling-strategy>
        </scheduler>
        <set-payload value='#[output application/json

var someInput = {
  "data": [
    {
      "cardName": "cardName1",
      "dataToMap": "first data"
    },
    {
      "cardName": "cardName2",
      "dataToMap": "2nd data"
    },
    {
      "cardName": "cardName1",
      "dataToMap": "2nd data for card name 1"
    }
  ]
}

---
someInput.data]' doc:name="Set Payload"  />
        <foreach doc:name="For Each"  >
            <set-variable value='#[output application/json

var varName = payload.cardName as String
---
(if (vars[varName] != null)
    vars[varName] ++ "** **" ++ payload.dataToMap
else
    payload.dataToMap
)]' doc:name="Set Variable" variableName="#[payload.cardName]"/>
        </foreach>
        <foreach doc:name="Copy_of_For Each" >
            <logger level="INFO" doc:name="Logger"  
            message="#[output application/json --- {varName: payload.cardName, varValue: vars[payload.cardName]}]"/>
            </foreach>
    </flow>
</mule>

`

这是第二个 For-Each 循环中每个动态命名变量的日志消息。请注意,有两个新变量是根据初始设置有效负载数据动态命名的。在更真实的流程中,有效负载将从事件源的输出中读取,例如从 HTTP 连接器或数据库连接器:

这是退出第二个 For-Each 范围后的有效负载和变量。有效载荷恢复到它的初始值,但在第一个 For-Each 范围内所做的更改在两个变量中持续存在: