【问题标题】:How to concatenate a flowVar to Json payload in Mule Dataweave如何在 Mule Dataweave 中将 flowVar 连接到 Json 有效负载
【发布时间】:2018-10-12 19:11:32
【问题描述】:

传入的有效载荷:

{
    "Categories": [
        {
            "ID": "5a873ca3",
            "Code": "CTY"
        }, {
            "ID": "89k873c8",
            "Code": "CTY"
        }
    ]
}

flowVar 值是一个 ArrayList:([84hkj569],[6j93hl9])

所需的输出负载:

  {
        "Categories": [
            {
                "ID": "5a873ca3",
                "Code": "CTY"
            }, {
                "ID": "89k873c8",
                "Code": "CTY"
            }, {
                "ID": "84hkj569",
                "Code": "CTY"
            }, {
                "ID": "6j93hl9",
                "Code": "CTY"
            }
        ]
    }

我在 dataweave 中找不到方法, 请帮忙

【问题讨论】:

    标签: mule dataweave transformer


    【解决方案1】:

    Brad Cooper 用于连接 JSON 有效负载和 flowVars.value 的 dataweave 代码可以正常工作。以下是适用于 3.8.1 的完整示例。

    完整代码:

    <mule xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
        xmlns:spring="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
    http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
    http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
    http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">
    
        <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
    
        <flow name="sample-dataweaveFlow">
            <http:listener config-ref="HTTP_Listener_Configuration" path="/sample" doc:name="HTTP"/>
            <logger message="Request Received" level="INFO" doc:name="Logger"/>
            <dw:transform-message doc:name="Transform Message">
                <dw:set-variable variableName="value"><![CDATA[%dw 1.0
    %output application/java
    ---
    ['84hkj569', '6j93hl9']]]></dw:set-variable>
            </dw:transform-message>
            <logger message="Flow Variable: #[flowVars.value]" level="INFO" doc:name="Logger"/>
            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %output application/json
    ---
    {
        Categories: [
            {
                "ID": "5a873ca3",
                "Code": "CTY"
            }, {
                "ID": "89k873c8",
                "Code": "CTY"
            }
        ]
    }]]></dw:set-payload>
            </dw:transform-message>
            <byte-array-to-string-transformer doc:name="Byte Array to String"/>
            <logger message="Payload: #[payload]" level="INFO" doc:name="Logger"/>
            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %output application/json
    ---
    {
        Categories: payload.Categories ++ (flowVars.value map {
            ID: $,
            Code: 'CTY' 
        })
    }]]></dw:set-payload>
            </dw:transform-message>
            <byte-array-to-string-transformer doc:name="Byte Array to String"/>
            <logger message="Final Response: #[payload]" level="INFO" doc:name="Logger"/>
        </flow>
    </mule>
    

    测试网址:

    http://localhost:8081/sample
    

    控制台输出:

    INFO  2018-05-09 01:08:51,575 [[sample-dataweave].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: Request Received
    INFO  2018-05-09 01:08:51,576 [[sample-dataweave].HTTP_Listener_Configuration.worker.01] com.mulesoft.weave.mule.utils.MuleWeaveFactory$: MimeType was not resolved '*/*' delegating to Java.
    INFO  2018-05-09 01:08:51,595 [[sample-dataweave].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: Flow Variable: [84hkj569, 6j93hl9]
    INFO  2018-05-09 01:08:51,596 [[sample-dataweave].HTTP_Listener_Configuration.worker.01] com.mulesoft.weave.mule.utils.MuleWeaveFactory$: MimeType was not resolved '*/*' delegating to Java.
    INFO  2018-05-09 01:08:51,620 [[sample-dataweave].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: Payload: {
      "Categories": [
        {
          "ID": "5a873ca3",
          "Code": "CTY"
        },
        {
          "ID": "89k873c8",
          "Code": "CTY"
        }
      ]
    }
    INFO  2018-05-09 01:08:51,635 [[sample-dataweave].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: Final Response: {
      "Categories": [
        {
          "ID": "5a873ca3",
          "Code": "CTY"
        },
        {
          "ID": "89k873c8",
          "Code": "CTY"
        },
        {
          "ID": "84hkj569",
          "Code": "CTY"
        },
        {
          "ID": "6j93hl9",
          "Code": "CTY"
        }
      ]
    }
    

    【讨论】:

    • 我同意,但是在更大的流程中,当您有嵌套循环时,它确实会运行,我认为这是 Mule 中的一个错误
    • 如果您可以提供您的流程 xml,那么也许我们可以进一步帮助您。
    • 谢谢你,Sagar,但我切换到 3.8.3 并且现在就像一个魅力。
    【解决方案2】:

    以下 dataweave 代码应该可以满足您的需求:

    %dw 1.0
    %output application/json
    ---
    {
        Categories: payload.Categories ++ (flowVars.value map {
            "ID": $,
            "Code": "CTY"
        })
    }
    

    这是我使用的示例流程的配置和输出:

        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
    %output application/json
    ---
    {
        "Categories": [
            {
                "ID": "5a873ca3",
                "Code": "CTY"
            }, {
                "ID": "89k873c8",
                "Code": "CTY"
            }
        ]
    }]]></dw:set-payload>
            </dw:transform-message>
            <scripting:component doc:name="Groovy">
                <scripting:script engine="Groovy"><![CDATA[
    flowVars.value = new java.util.ArrayList();
    flowVars.value.add("84hkj569");
    flowVars.value.add("6j93hl9");
    return payload;
    ]]></scripting:script>
            </scripting:component>
            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %output application/json
    ---
    {
        Categories: payload.Categories ++ (flowVars.value map {
            "ID": $,
            "Code": "CTY"
        })
    }]]></dw:set-payload>
            </dw:transform-message>
    

    输出:

    {
        "Categories": [
            {
                "ID": "5a873ca3",
                "Code": "CTY"
            },
            {
                "ID": "89k873c8",
                "Code": "CTY"
            },
            {
                "ID": "84hkj569",
                "Code": "CTY"
            },
            {
                "ID": "6j93hl9",
                "Code": "CTY"
            }
        ]
    }
    

    【讨论】:

    • 由于某种原因我无法从 flowVars 中获取值,它被定义为 java.util.ArrayList(),我收到以下错误(发现“map”运算符的类型不匹配:string, :function 需要 :array, :function)
    • 该错误似乎向我暗示 flowVars.value 是一个字符串,而不是您所说的 ArrayList 。这听起来像是一个愚蠢的问题,但你是如何初始化这个变量的?我创建了一个示例流来对其进行测试,并使用表达式 #[["84hkj569","6j93hl9"]] 创建了 flowVar,这似乎对我有用...
    • 我试图将它作为一个字符串挂接到转换器本身,我也尝试将它作为一个映射,我将它定义为 #[new java.util.ArrayList()],并且我向它添加了一些字符串,但它在 dataweave 中无法识别它
    • 奇怪。我已经编辑了我的原始答案,以包含一个完整的流程,展示我如何初始化 flowVar(现在使用 new ArrayList() 等)。您使用的是什么版本的 Mule/Studio?这是带有 Mule 3.9.0 的 Studio 6.4.4
    • 可能需要查看您的整个流程 xml 以进一步提供帮助
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多