Drools中如何将A类Waiver列表转换为WaiverInfo列表存入B类实例
需求可行性结论
这个需求完全可以在Drools中实现,Drools原生支持集合遍历、对象属性映射、新实例创建和内存对象属性修改,完全覆盖你提到的转换场景。
实现核心思路
- 提前将类A的实例、类B的实例统一插入到Drools工作内存中
- 编写规则同时匹配工作内存中的A实例、B实例,以及A持有的
waivers列表中的单个Waiver对象 - 规则命中后,为每个Waiver对象创建对应WaiverInfo实例,复制
code、name属性,追加到B的waiverList列表中即可
规则示例(.drl文件代码)
package com.example.rules // 替换为实际的类所在包路径 import com.example.pojo.A import com.example.pojo.B import com.example.pojo.Waiver import com.example.pojo.WaiverInfo import java.util.ArrayList rule "Waiver转WaiverInfo并存入B实例" no-loop // 避免同一条数据重复触发规则 when $a: A($waiverList: waivers != null) $b: B($infoList: waiverList) // 遍历A的waivers列表取出单个Waiver对象 $waiver: Waiver() from $waiverList then // 初始化B的列表避免空指针 if($infoList == null) { $b.setWaiverList(new ArrayList<>()); } // 构建WaiverInfo对象复制属性 WaiverInfo info = new WaiverInfo(); info.setCode($waiver.getCode()); info.setName($waiver.getName()); // 存入B的列表 $b.getWaiverList().add(info); end
注意事项
- 你提供的Java类属性都是默认访问权限,实际使用时需要补充对应属性的
getter、setter方法,或将属性设置为public,保证Drools可以正常读写属性 - 如果存在多规则触发的场景,可以额外加属性校验逻辑,避免重复插入相同的转换对象
- 规则执行完成后,直接从工作内存中取出B实例即可拿到已经填充完成的
waiverList
内容的提问来源于stack exchange,提问作者dhruv dar
相关产品推荐
相关产品推荐

