Drools决策表多实例对象添加问题:SubjectList值被覆盖求助
解决Drools决策表中SubjectFact被覆盖的问题
嘿,我来帮你搞定这个Drools的问题!从你的描述和代码来看,核心问题出在规则动作的逻辑设计以及POJO类的几个小错误上,咱们一步步来解决:
第一步:修正POJO类的基础错误
先把你的事实类里的拼写、类型错误改掉,这些细节很容易被忽略,但会直接影响后续逻辑的正常运行:
StudentFact类的修正
public class StudentFact { private int id; private String name; private List<SubjectFact> subjectList; public void setId(int id) { this.id = id; } public int getId() { return id; } // 修正:this.Name → this.name(大小写错误) public void setName(String name) { this.name = name; } public String getName() { return name; } // 修正:参数类型从List<Subject>改为List<SubjectFact> public void setSubjectList(List<SubjectFact> subjectList) { this.subjectList = subjectList; } // 修正:返回类型从int改为List<SubjectFact> public List<SubjectFact> getSubjectList() { return subjectList; } }
SubjectFact类的修正
public class SubjectFact { private int subId; private String subjectName; public void setSubId(int subId) { this.subId = subId; } public int getSubId() { return subId; } public void setSubjectName(String subjectName) { this.subjectName = subjectName; } // 修正:方法名拼写错误getSubejctName→getSubjectName,返回类型从int改为String public String getSubjectName() { return subjectName; } }
第二步:调整Drools决策表的规则动作逻辑
你现在得到重复数据的原因,大概率是下面两种情况之一:
- 每次规则触发时,都新建一个
ArrayList并覆盖student的subjectList,导致之前添加的元素被清空; - 重复使用同一个
SubjectFact实例,每次只更新它的属性再添加到列表,最终列表里的所有元素都是同一个对象,显示最后一次的属性值。
正确的规则动作写法
在决策表的动作列中,要保证每次创建新的SubjectFact实例,并添加到已有的列表中(如果列表为空则先初始化):
// 获取当前匹配的StudentFact实例 StudentFact currentStudent = $student; // 初始化subjectList(如果还未创建) if (currentStudent.getSubjectList() == null) { currentStudent.setSubjectList(new java.util.ArrayList<SubjectFact>()); } // 创建新的SubjectFact实例,避免重复使用同一个对象 SubjectFact newSubject = new SubjectFact(); newSubject.setSubId($subId); // $subId是决策表中定义的参数(对应期望的5/6) newSubject.setSubjectName($subjectName); // $subjectName对应期望的English/Hindi // 将新实例添加到列表,而不是覆盖整个列表 currentStudent.getSubjectList().add(newSubject);
第三步:验证规则触发逻辑
确保你的决策表中,每个规则对应的$subId和$subjectName参数是正确的(比如第一个规则对应id=5、name=English,第二个对应id=6、name=Hindi),这样触发后就能得到你期望的列表内容。
另外,不需要额外调用update(currentStudent)来通知Drools,因为我们是修改对象内部的集合,Drools会跟踪对象的状态变化,规则触发后工作内存中的StudentFact实例会保留所有添加的SubjectFact。
按照上面的步骤调整后,就能得到你想要的响应结果啦!
内容的提问来源于stack exchange,提问作者Debugger
相关产品推荐
相关产品推荐

