Dataweave键值从数据库设置为HashMap

时间:2016-04-21 20:11:16

标签: mule dataweave

我的流程是这样的:

我收到的有效载荷如下:

[' BobsFirstStatus',' BobsSecondStatus',' BobsEightStatus']

我的数据库中有一个查找表,如下所示:

ID_|_BobStatusName___|_InternalStatusName_____
1  | BobsFirstStatus | Internal_1stStatus
2  | BobsSecondStatus| Internal_2ndStatus
3  | BobsEighStatus  | Internal_3rdStatus

我想从数据库中读取这些数据,并加载一个HashMap,如下所示:

{
  "BobsFirstStatus": "Internal_1stStatus",
  "BobsSecondStatus": "Internal_2ndStatus",
  "BobsEighStatus": "Internal_3rdStatus"
}
这样,我可以在数据编织语句中做一个" flowVars.Lookup [payload.BobStatus]"检索我们的状态内部映射。

以前有人这么做过吗?看起来很有用......

2 个答案:

答案 0 :(得分:1)

可靠的计划,虽然我不喜欢在流量变量中这样做。您只需创建一个查找流,然后从DWL like so中调用它。您可能希望使用Cache范围来避免每次都这样做。

我之前也在春天的豆子里做过,我对最终的结果感到满意。这仅适用于我希望仅在应用程序发布时或更少发生时更改的查找表。

  1. 创建Map类型的bean。您可以使用原生Spring <util:map&gt;为了这。使用spring <entry>元素

    配置查找键和值

    <util:map id="statusTable">

    <entry key="BobsFirstStatus" value="Internal_1stStatus" />

    <entry key="BobsSecondStatus" value="Internal_2ndStatus" />

    <entry key="BobsEighStatus" value="Internal_3rdStatus" />

    </util:map>

  2. 使用MEL app上下文对象

    引用bean

    #[app.registry.statusTable[flowVars.status]]

答案 1 :(得分:0)

我最后用脚本组件解决了我的问题,使用下面的groovy是我使用的groovy脚本(注意,我在调用数据库选择组件之前将有效负载放在名为“payload_cache”的变量中):

def lookup = [:]
for (item in payload) {
    lookup[item['external_code']] = item['internal_code']
}
flowVars.NewResults = new ArrayList()
def ContainingDTO = flowVars.payload_cache.ContainingDTO
if (ContainingDTO){
    def ExternalItemList = ContainingDTO.ExternalItemList
    if (ExternalItemList){
        for (item in ExternalItemList){
            try{
                flowVars.NewResults.add(lookup[item])
            }catch(Exception){
                flowVars.NewResults.add('UNKNOWN')
            }
        }
    }
}

Database component in cache component followed by a script component