如何从Drools DMNModel对象中按名称查找DecisionTable
解决Drools DMN中通过事件名称定位嵌套DecisionTable的问题
核心原理
AfterEvaluateDecisionTableEvent返回的决策表名称,本质是该DecisionTable在父级表达式(比如Context)中的引用别名——也就是ContextEntry的变量名。而DecisionTable本身的id/label是模型定义里的标识,和这个别名不直接关联,这就是你之前匹配失败的原因。
具体实现步骤
定位决策节点:先用事件里的决策节点名称,从
DMNModel中找到对应的DecisionNode:DecisionNode decisionNode = dmnModel.getDecisionNodes().stream() .filter(dn -> dn.getName().equals(event.getDecisionNodeName())) .findFirst() .orElseThrow(() -> new IllegalArgumentException("找不到决策节点: " + event.getDecisionNodeName()));递归遍历表达式树,匹配别名:写一个递归方法,遍历决策节点的表达式结构,当遇到Context时,检查每个ContextEntry的变量名是否和事件返回的决策表名称一致,对应的表达式就是目标DecisionTable:
private DecisionTable findNestedDecisionTable(DMNExpression expression, String targetTableName) { if (expression instanceof DecisionTable) { // 非嵌套场景,直接返回(此时事件里的决策表名称应该和决策节点名称一致) return (DecisionTable) expression; } else if (expression instanceof Context) { Context context = (Context) expression; for (ContextEntry entry : context.getContextEntries()) { // ContextEntry的变量名就是事件里的决策表名称 if (entry.getVariableName().equals(targetTableName)) { DMNEntryExpression entryExpr = entry.getEntryExpression(); if (entryExpr.getExpression() instanceof DecisionTable) { return (DecisionTable) entryExpr.getExpression(); } else { // 处理多层嵌套的Context,递归查找 return findNestedDecisionTable(entryExpr.getExpression(), targetTableName); } } // 遍历当前Context下的所有子表达式,处理深层嵌套 DecisionTable nestedTable = findNestedDecisionTable(entry.getEntryExpression().getExpression(), targetTableName); if (nestedTable != null) { return nestedTable; } } } // 处理其他可能的表达式类型(如Invocation、Literal等,根据你的模型调整) return null; }调用方法获取目标DecisionTable:
DecisionTable targetTable = findNestedDecisionTable(decisionNode.getExpression(), event.getDecisionTableName());
关键说明
- 当DecisionTable直接作为DecisionNode的表达式时,
event.getDecisionTableName()会等于决策节点名称,此时递归方法会直接返回该DecisionTable。 - 多层嵌套Context的场景下,递归会逐层遍历ContextEntry,直到找到变量名匹配的那个对应的DecisionTable。
- 如果你模型里还有其他表达式类型嵌套DecisionTable(比如Invocation),可以在递归方法中添加对应的类型判断逻辑。
内容的提问来源于stack exchange,提问作者AgilePro
相关产品推荐
相关产品推荐

