Drools对象数组多条件校验同一对象报错及规则编写咨询
Drools 9.44.0.Final 动态条件校验问题解决
问题根源
- 原规则多次通过
from $persons绑定不同变量($person1、$person2、$person3),Drools会默认匹配集合中的不同Person对象,无法保证所有条件作用于同一实例。 - 末尾
PersonClass($person1 == $person2, $person2 = $person3) from $persons属于语法错误:Drools将$person1解析为PersonClass的方法名,导致抛出unable to resolve method错误。
正确规则写法(强制同一对象校验)
核心是将所有约束集中到同一个PersonClass实例上,仅执行一次from $persons绑定,确保所有条件针对同一对象生效。对应原逻辑(同一对象满足「姓名为tom或地址为x」且「车型为aa」)的规则如下:
($person: PersonClass( (getName() == "tom" || getAddress() == "x") && getCarType() == "aa" ) from $persons)
若需要更清晰的结构,也可以用where子句拆分条件:
($person: PersonClass() from $persons) where ($person.getName() == "tom" || $person.getAddress() == "x") && $person.getCarType() == "aa"
动态条件适配注意事项
如果是用户输入的动态条件,拼接规则字符串时要始终围绕同一个绑定变量(如$person)的属性做判断,避免多次使用from $persons绑定不同变量,确保所有约束最终作用于同一Person对象。
内容的提问来源于stack exchange,提问作者sami610
相关产品推荐
相关产品推荐

