规则触发后无法更新继承抽象类的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
相关产品推荐
相关产品推荐

