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

Spring Boot集成Drools多drl文件触发时报ConstraintEvaluationException如何解决

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:15:04