You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mule ESB 3.8:如何合并两个数据库返回的HashMap类型Payload(非DataWeave)

合并两个数据库返回Payload的非DataWeave实现方案

问题回顾

你需要将两次数据库调用的结果合并:

  • 第一个Payload(列表类型):
    [{Name=John, Age=31}]
    
  • 第二个Payload(单键Map类型):
    Address=[{Planet=Earth, Continent=Europa, Town=London},{Planet=Earth, Continent=Europa, Town=Dublin}]
    
  • 期望结果:
    [{Name=John, Age=31, Address=[{Planet=Earth, Continent=Europa, Town=London},{Planet=Earth, Continent=Europa, Town=Dublin}]}]
    

失败原因分析

你尝试的++和putAll()方法无效,核心原因是类型不匹配:

  • ++用于合并同类型集合(如两个List或两个Map),但你的第一个Payload是List<Map>,第二个是单键Map,直接合并会报错。
  • putAll()是Map的专属方法,而你第一个Payload是List,不是单个Map对象,无法直接调用。

非DataWeave解决方案(Groovy脚本)

在Mule中可以使用Groovy脚本组件实现,步骤如下:

  1. 存储两次调用结果:将两次数据库调用的返回值分别存入变量(Mule 3用flowVars,Mule 4用vars),比如vars.payload1(第一个结果)和vars.payload2(第二个结果)。

  2. 执行Groovy脚本:

// Mule 4版本
def mergedList = []
// 遍历第一个Payload的每个元素(示例中仅一个元素)
vars.payload1.each { user ->
    // 给用户对象添加Address属性,值取自第二个Payload的Address列表
    user.Address = vars.payload2.Address
    mergedList.add(user)
}
return mergedList

如果是Mule 3,只需把vars替换为flowVars:

// Mule 3版本
def mergedList = []
flowVars.payload1.each { user ->
    user.Address = flowVars.payload2.Address
    mergedList.add(user)
}
return mergedList

替代实现(直接操作单个Map)

如果第一个Payload的列表中始终只有一个元素,也可以简化脚本:

// Mule 4版本
def user = vars.payload1[0]
user.Address = vars.payload2.Address
return [user]

说明

  • 该方案通过遍历第一个列表的元素,直接给每个元素添加Address属性,完美匹配你需要的最终结构。
  • 脚本逻辑通用,即使第一个Payload的列表中有多个用户对象,也能批量给每个用户添加对应的Address列表。

内容的提问来源于stack exchange,提问作者Gorodeckij Dimitrij

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:03:21