Drools DRT含空值参数时规则条件消失问题及解决方案咨询
解决Drools DRT模板空参数导致规则条件消失的问题
问题原因
Drools DRT模板引擎处理空值/空字符串参数时,会将包含空占位符的表达式片段判定为无效并直接移除,连锁反应下会导致整个规则条件块被清空,最终生成的规则when部分为空。
解决方案
1. 为模板参数添加默认值处理
使用DRT的默认值语法@{参数名?:默认值},确保空参数被替换为合法值而非直接移除表达式。修改后的模板如下:
rule "Rule1_@{row.rowNumber}" when variable:Fact(("All"=="@{Column1}" || ("Gold"=="@{Column1}" && @{Column2?:null} == GoldId) || ("Silver"=="@{Column1}" && @{Column2?:null} == SilverId)) && ("All"=="@{Column3}" || ("Diamond"=="@{Column3}" && @{Column4?:null}== DiamondId) || ("Platinum"=="@{Column3}" && @{Column4?:null}== PlatinumId)) && ("@{Column5?:''}" == Column5) && ("@{Column6?:''}" == Column6)) then list.add(@{Column7?:0}+"@{Column8?:''}"); end
根据业务需求选择默认值:
- 数值类型参数可设为
0或null - 字符串类型参数可设为
''或null - 引用类型参数设为
null即可
2. 重构条件逻辑,规避空参数影响
针对"All"这类无需后续参数的场景,将其判断逻辑前置,确保即使后续参数为空,也不会影响整个条件块的有效性。比如将第一部分条件调整为:
"All"=="@{Column1}" || ("Gold"=="@{Column1}" && @{Column2?:null} != null && @{Column2?:null} == GoldId) || ("Silver"=="@{Column1}" && @{Column2?:null} != null && @{Column2?:null} == SilverId)
这样当Column1为"All"时直接匹配;当Column1为Gold/Silver但Column2为空时,该分支条件不成立,不会导致整个表达式失效。
3. 预处理输入参数
在将参数传入DRT模板之前,对空字符串参数进行预处理:
- 将空字符串替换为
null或业务允许的默认值 - 针对"All"对应的关联参数(如Column1为"All"时的Column2),直接设置为无需参与判断的占位值,避免模板替换时出现无效表达式
验证效果
当Column1=All、Column2为空、Column3=Diamond、Column4=9时,修改后的模板会生成如下规则:
rule "Rule1_2" when variable:Fact(("All"=="All" || ("Gold"=="All" && null == GoldId) || ("Silver"=="All" && null == SilverId)) && ("All"=="Diamond" || ("Diamond"=="Diamond" && 9== DiamondId) || ("Platinum"=="Diamond" && null== PlatinumId)) && ("" == Column5) && ("" == Column6)) then list.add(1+"Customer"); end
此时规则条件块完整,可正常编译运行。
内容的提问来源于stack exchange,提问作者Samyak
相关产品推荐
相关产品推荐

