Drools决策表中列表类型数据的规则编写问题
在Drools DMN决策表中处理列表类型输入的规则编写方案
问题根源
单独调用list contains()函数正常但决策表不生效,核心原因是输入数据的DMN类型定义不匹配或决策表列绑定/语法细节出错——FEEL在决策表上下文对类型的严谨性比单独调用函数时更高。
具体解决步骤
修正DMN输入数据的类型定义
在DMN模型的输入数据配置中,将IntegerArr的类型明确设置为list(integer),不要使用自定义的模糊类型。只有让引擎明确识别为FEEL标准列表类型,才能在决策表的when条件中正确执行包含判断。严格遵循决策表when列的FEEL语法
确保when单元格中的表达式写法准确,示例如下:list contains(IntegerArr, 1)同时要确认决策表的输入列已正确绑定到IntegerArr变量,避免因选错变量导致条件匹配失效。
验证Java输入的类型兼容性
虽然ArrayList<Integer>通常会被DMN引擎自动转换为FEEL的list(integer),如果仍有问题可以尝试:- 将Java代码中的
ArrayList<Integer>替换为List<Integer>(接口类型更符合DMN引擎的类型转换预期); - 确认Drools引擎配置中开启了Java与FEEL类型的自动转换(默认开启,部分自定义配置可能关闭)。
- 将Java代码中的
排查决策表的其他配置
- 检查决策表的命中策略(Hit Policy),比如设置为
UNIQUE时,需确保没有其他规则与当前条件冲突; - 确认决策表的输出列或其他规则没有覆盖当前条件的执行逻辑。
- 检查决策表的命中策略(Hit Policy),比如设置为
验证示例
- DMN输入数据定义:名称
IntegerArr,类型list(integer); - 决策表输入列绑定
IntegerArr,when单元格写入list contains(IntegerArr, 1); - Java输入数据保持原代码:
此时决策表应能正确命中该规则。ArrayList<Integer> arr = new ArrayList<>(); arr.add(1); arr.add(2); HashMap input = new HashMap(); input.put("IntegerArr", arr);
内容的提问来源于stack exchange,提问作者Donnie Y
相关产品推荐
相关产品推荐

