我有一个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>
我的问题
如何匹配密钥以转到正确的子流。我一直得到默认/否则选项,因为它与密钥不匹配。
答案 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]" />
您可以根据键匹配流名称,它可以重定向它而无需添加选项。