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脚本组件实现,步骤如下:
存储两次调用结果:将两次数据库调用的返回值分别存入变量(Mule 3用
flowVars,Mule 4用vars),比如vars.payload1(第一个结果)和vars.payload2(第二个结果)。执行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
相关产品推荐
相关产品推荐

