骡子在选择中比较地图键

Mule comparing map keys in choice

我有一个 Map 负载,我正在使用 foreach 获取 key/value 对以在流程中进一步处理。

示例地图负载:
{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>

我的问题
如何匹配密钥以转到正确的子流程。我一直收到 default/otherwise 选项,因为它与密钥不匹配。

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

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

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

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

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

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