Spring Boot集成Drools多drl文件触发时报ConstraintEvaluationException如何解决
问题根因
- 你当前的Drools配置会把
rule/目录下所有规则文件加载到同一个KieBase中,所有规则共享同一个运行上下文。 agenda-group的setFocus()方法仅控制已匹配成功的规则是否进入执行队列,不会拦截其他agenda-group的规则对插入的Fact(即代码中的JSONObject)做LHS(规则左侧条件)的评估计算。- 你在testB方法中插入的JSONObject仅包含
bSize字段,net.sf.json.JSONObject读取不存在的key时会返回null,此时d.drl中aSize == 1的约束会触发空值运算异常,直接在匹配阶段报错,和该规则是否属于你指定的agenda-group无关。
修复方案
- 方案1:修改规则约束,增加字段存在性校验,是成本最低的修复方式
修改d.drl中的规则条件,先判断字段存在再做值比较:
同理也可以给a.drl的规则加上when $j : JSONObject(containsKey("aSize") && aSize == 1) thencontainsKey("bSize")的前置判断,避免后续插入其他Fact时报错。 - 方案2:拆分规则到不同KieBase,实现业务规则隔离
调整Drools配置,将不同业务域的规则放到不同子目录(比如rule/groupA/、rule/groupB/),分别加载到独立的KieBase中,需要触发哪类规则就从对应的KieBase中创建KieSession,完全隔离无关规则的匹配逻辑。 - 方案3:用Map安全取值写法编写规则条件
因为net.sf.json.JSONObject实现了Map接口,可以直接用Map的取值写法避免空指针异常:
Drools对Map的key不存在的场景会直接返回条件不成立,不会抛出异常。when $j : JSONObject(this['aSize'] == 1) then
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

