骡子比较地图键在选择中

时间:2015-05-18 15:53:03

标签: mule

我有一个Map有效负载,而我正在使用 foreach 来获取键/值对以进一步处理流程。

示例地图有效负载:
{key1 = [org.myorg.domain.MyObj@7d9bae39,org.myorg.domain.MyObj@2a23741b],
key2 = [org.myorg.domain.MyObj@7d9abd39,org.myorg.domain.MyObj@23de741b]}

并在其中进行选择,将其指向相应的子流,如下所示:

<foreach doc:name="For Each">
    <choice doc:name="Choice">
        <when expression="#[message.payload.key1 == 'key1']">
            <flow-ref name="subflow_1" doc:name="one"/>
        </when>
        <when expression="#[message.payload.key2 == 'key2']">
            <flow-ref name="subflow_2" doc:name="two"/>
        <when expression="#[message.payload.key3 == 'key3']">
            <flow-ref name="subflow_3" doc:name="three"/>
        </when>
        <otherwise>
            <logger message="no match, default #[message.payload]" level="INFO" doc:name="payload"/>
        </otherwise>
    </choice>
</foreach>

我的问题
如何匹配密钥以转到正确的子流。我一直得到默认/否则选项,因为它与密钥不匹配。

2 个答案:

答案 0 :(得分:0)

您的表达式是根据映射条目值而不是键本身来计算的。如果要检查地图是否包含特定键,可以使用keySet,或者只使用简单的空检查:

 <when expression="#[payload.keySet().contains('key1')]">

 <when expression="#[message.payload['key1'] != null]">

答案 1 :(得分:0)

实际上有一个更优雅的解决方案,无需使用选择。 Flow-ref接受一个mule表达式作为流程名称,即:

<flow-ref name="#[payload.key]" />

您可以根据键匹配流名称,它可以重定向它而无需添加选项。