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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:52:31