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

规则触发后无法更新继承抽象类的Fact问题及正确实现求助

问题原因及修正方案

核心问题分析

你的代码存在多个关键错误,导致规则触发后Fact未更新:

1. Java类的构造方法与Builder实现错误

  • AnotherClass构造方法定义错误:构造方法名必须与类名一致,你写成了private TestClass(String reviewDefinitionName),这是无效的,应该改为private AnotherClass(String reviewDefinitionName)。
  • Builder的build方法返回类型错误:抽象类TestClass无法直接实例化,且你需要返回AnotherClass实例,而非TestClass。同时,build方法内部应该创建AnotherClass对象,而非尝试实例化抽象类。
  • getUpdateFact方法返回类型错误:该方法用于获取字符串,但你定义为public void getUpdateFact(),会导致编译错误,应改为public String getUpdateFact()。

2. DRL规则中的语法错误

  • 类名拼写错误:AnotherClas.Builder()应为AnotherClass.Builder()。
  • 方法调用遗漏括号:from $a.build应改为from $a.build(),因为build是方法,需要执行调用才能生成对象。

3. Fact未纳入Drools工作内存管理

通过$a.build()生成的AnotherClass对象并没有被插入到Drools工作内存中,即使你在规则then块中修改了它,Drools不会跟踪这个对象的状态变化,自然无法识别Fact的更新。


正确实现代码

修正后的Java类

抽象类TestClass

public abstract class TestClass {
    public final String definitionName;

    protected TestClass(String definitionName) {
        this.definitionName = definitionName;
    }
}

实现类AnotherClass

public class AnotherClass extends TestClass {

    private String updateFact;

    // 修正构造方法名,与类名一致
    private AnotherClass(String reviewDefinitionName) {
        super(reviewDefinitionName);
    }

    public void setUpdateFact(String updateFact) {
        this.updateFact = updateFact;
    }

    // 修正返回类型为String
    public String getUpdateFact() {
        return updateFact;
    }

    public static class Builder {
        private String definitionName;

        // 修正返回类型为AnotherClass,实例化正确的子类
        public AnotherClass build() {
            return new AnotherClass(definitionName);
        }

        public Builder definitionName(String definitionName) {
            this.definitionName = definitionName;
            return this;
        }
    }
}

修正后的DRL规则

rule "Rule_1"
    when
        // 修正类名拼写错误
        $a : AnotherClass.Builder()
        // 修正方法调用,添加括号执行build方法
        $b : AnotherClass(definitionName = "test") from $a.build()
    then
        $b.setUpdateFact("updated");
        // 如果$b是首次创建,需要插入到工作内存;如果已存在,用update通知Drools对象变更
        insert($b);
        // 若$b原本就在工作内存中,替换为update($b);
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:30:23