Drools 7.37规则绑定变量报错Variables can not be used inside bindings求助
报错原因
Drools 7.x版本引入了语法限制,不允许在事实的属性绑定表达式中引用同一规则条件中提前定义的其他事实变量,你在Child的属性绑定中调用函数时传入了前面声明的$exportData变量,就触发了该校验规则。
可行解决方案
方案1:使用from关键字提取薪资变量(推荐,可复用变量)
调整drl规则的条件结构,将薪资计算从Child的属性绑定中剥离,用from关键字单独生成变量,语法如下:
import com.myorg.model.Child; import com.myorg.model.ExportData; import function com.myorg.utils.getParentSalary; rule "Classification childSpecialSchool" when $exportData : ExportData() $child : Child(_age < 15 && _age > 10) $parentSalary : Double(this > 4000) from getParentSalary($exportData, $child) then $child.set_classification("childSpecialSchool"); end
如果需要在then逻辑中使用薪资值,直接调用$parentSalary即可,该写法完全符合7.37版本的语法要求。
方案2:直接访问Map简化逻辑(性能最优)
你的薪资数据本身存储在ExportData的mapSalary字段中,不需要通过自定义函数读取,直接用Drools内置的Map访问语法即可,还能避开变量绑定限制:
import com.myorg.model.Child; import com.myorg.model.ExportData; rule "Classification childSpecialSchool" when $exportData : ExportData($mapSalary : mapSalary) $child : Child(_age < 15 && _age > 10, $mapSalary[this] > 4000) then $child.set_classification("childSpecialSchool"); end
其中this指代当前匹配到的Child对象,作为key从Map中读取对应薪资做判断,执行效率比调用自定义函数更高。
方案3:eval块兼容复杂逻辑(兼容性最强)
如果你的getParentSalary函数包含不可简化的复杂业务逻辑,可以用eval块封装判断逻辑,不需要做变量绑定:
import com.myorg.model.Child; import com.myorg.model.ExportData; import function com.myorg.utils.getParentSalary; rule "Classification childSpecialSchool" when $exportData : ExportData() $child : Child(_age < 15 && _age > 10) eval(getParentSalary($exportData, $child) > 4000) then $child.set_classification("childSpecialSchool"); end
内容的提问来源于stack exchange,提问作者provista
相关产品推荐
相关产品推荐

