{"record":{"id":"3b292a07faea97b4","repo":"flowable/flowable-engine","slug":"decision-has-multiple-results","errorCode":null,"errorMessage":"Decision has multiple results","messagePattern":"Decision has multiple results","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-api/src/main/java/org/flowable/dmn/api/DmnDecisionRuleResult.java","lineNumber":56,"sourceCode":"        for (Map<String, Object> ruleOutputValues : ruleResults) {\n            outputValues.add(ruleOutputValues.get(outputName));\n        }\n        return outputValues;\n    }\n\n    public Map<String, Object> getFirstRuleResult() {\n        if (ruleResults.size() > 0) {\n            return ruleResults.get(0);\n        } else {\n            return null;\n        }\n    }\n\n    public Map<String, Object> getSingleRuleResult() {\n        if (ruleResults.isEmpty()) {\n            return null;\n        } else if (ruleResults.size() > 1) {\n            throw new FlowableException(\"Decision has multiple results\");\n        } else {\n            return getFirstRuleResult();\n        }\n    }\n}\n","sourceCodeStart":38,"sourceCodeEnd":62,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-api/src/main/java/org/flowable/dmn/api/DmnDecisionRuleResult.java#L38-L62","documentation":"DmnDecisionRuleResult wraps a DMN decision's rule output rows. getSingleRuleResult() is only valid when the decision produced exactly one result; with more than one row it refuses to guess which to return and throws. Use getFirstRuleResult() or the full result list when multiple outcomes are expected.","triggerScenarios":"Calling dmnDecisionService.executeDecision... then getSingleRuleResult() on a decision table whose rules matched multiple times (multiple output rows), or a decision whose expression produced several outputs.","commonSituations":"Multi-hit decision tables (hit policy not unique), rules with overlapping conditions so several rules fire, developers assuming single-result semantics.","solutions":["Call getFirstRuleResult() if any result is acceptable.","Iterate the full ruleResults list and handle each row.","Tighten decision table rules / set hit policy (e.g. UNIQUE or FIRST) so only one result is produced.","Check ruleResults.isEmpty()/size() before calling getSingleRuleResult()."],"exampleFix":"// before\nMap<String, Object> result = ruleResult.getSingleRuleResult();\n// after\nMap<String, Object> result = ruleResult.getFirstRuleResult();","handlingStrategy":"type-guard","validationCode":"if (ruleResult != null && ruleResult.size() == 1) {\n    Map<String, Object> single = ruleResult.getSingleRuleResult();\n} else if (ruleResult != null && ruleResult.size() > 1) {\n    // handle multi-result case first\n}","typeGuard":"boolean hasSingleResult(DmnDecisionRuleResult r) { return r != null && r.size() == 1; }","tryCatchPattern":"try { return ruleResult.getSingleRuleResult(); } catch (FlowableException e) { if (\"Decision has multiple results\".equals(e.getMessage())) return ruleResult.getFirstRuleResult(); throw e; }","preventionTips":["Check ruleResults size before requesting a single result","Design decision tables with unique/first hit policy","Use getFirstRuleResult() when any result is acceptable"],"tags":["dmn","decision-table","multiple-results"],"backgroundTag":"unexpected-response-shape","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}