Drools规则引擎DRT模板传递列表参数问题排查
Drools DRT模板传列表参数的问题解决
问题1:无法访问列表元素,控制台无输出
原因
参数传递方式或模板遍历逻辑错误,导致模板无法正确解析列表元素,生成的规则未匹配到数据。
解决步骤
正确封装参数:
不要直接传递整个列表作为单个参数,而是将列表的每个元素封装为独立的数据行(Map或POJO),再组成List传入ObjectDataCompiler。示例Java代码:List<Map<String, Object>> templateData = new ArrayList<>(); List<String> tags = Arrays.asList("XYZ", "ABC", "PQR"); for (String tag : tags) { Map<String, Object> row = new HashMap<>(); row.put("tag", tag); templateData.add(row); } ObjectDataCompiler compiler = new ObjectDataCompiler(); String drl = compiler.compile(templateData, new FileInputStream("tag-template.drt"));模板匹配参数结构:
编写DRT模板时,使用template header声明参数名,然后在模板中直接引用参数。示例DRT:template header tag template rule "Tag_Match_@{row.rowNumber}" when $input: String(this == "@{tag}") then System.out.println("匹配到标签: @{tag}"); end这样每个标签会生成独立规则,触发时控制台会输出对应内容。
如果需要将整个列表作为规则的判断条件(如判断元素是否在列表中),可将列表转为逗号分隔的字符串后传入:
- Java代码:
String tagStr = String.join("\", \"", tags); // 生成 "XYZ", "ABC", "PQR" Map<String, Object> row = new HashMap<>(); row.put("tagList", tagStr); templateData.add(row); - DRT模板:
template header tagList template rule "Check_Tag_In_List" when $input: String(this in ("@{tagList}")) then System.out.println("标签 " + $input + " 在列表中"); end
问题2:用tag[]声明模板时首尾元素带方括号
原因
直接传递数组时,模板会调用数组的toString()方法,生成的字符串格式为[XYZ, ABC, PQR],拆分后首尾元素会包含方括号。
解决步骤
优先使用List替代数组:
List的toString()格式和数组类似,但可以通过String.join()轻松转换为无方括号的字符串,避免格式问题。数组转字符串后传入:
如果必须使用数组,先将数组转为标准的逗号分隔字符串(不含方括号),再传入模板。示例Java代码:String[] tagsArr = {"XYZ", "ABC", "PQR"}; String tagStr = String.join("\", \"", tagsArr); Map<String, Object> row = new HashMap<>(); row.put("tagStr", tagStr); templateData.add(row);模板中直接引用
@{tagStr}即可生成正确的规则条件,不会出现方括号。
内容的提问来源于stack exchange,提问作者Harsha
相关产品推荐
相关产品推荐

