{"record":{"id":"29e91cd693c86b8c","repo":"flowable/flowable-engine","slug":"could-not-create-conclusion-result","errorCode":null,"errorMessage":"Could not create conclusion result","messagePattern":"Could not create conclusion result","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java","lineNumber":271,"sourceCode":"                Object resultValue = ELExpressionExecutor.executeOutputExpression(ruleClauseContainer.getOutputClause(), outputEntryExpression, expressionManager, executionContext);\n                executionVariable = ExecutionVariableFactory.getExecutionVariable(outputVariableType, resultValue);\n\n                // update execution context\n                executionContext.getStackVariables().put(outputVariableId, executionVariable);\n\n                // create result\n                if (getHitPolicyBehavior(hitPolicy) instanceof ComposeRuleResultBehavior) {\n                    ((ComposeRuleResultBehavior) getHitPolicyBehavior(hitPolicy)).composeRuleResult(ruleNumber, outputVariableId, executionVariable, executionContext);\n                }\n\n                // add audit entry\n                executionContext.getAuditContainer().addOutputEntry(ruleNumber, outputEntryExpression.getId(), executionVariable);\n                executionContext.getAuditContainer().addDecisionResultType(outputVariableId, outputVariableType);\n\n                if (executionVariable != null) {\n                    LOGGER.debug(\"Created conclusion result: {} of type: {} with value {}\", outputVariableId, resultValue.getClass(), resultValue);\n                } else {\n                    LOGGER.warn(\"Could not create conclusion result\");\n                }\n\n            } catch (FlowableException ade) {\n                // clear result variables\n                executionContext.getRuleResults().clear();\n\n                // add failed audit entry and rethrow\n                executionContext.getAuditContainer().addOutputEntry(ruleNumber, outputEntryExpression.getId(), getExceptionMessage(ade), executionVariable);\n                throw ade;\n\n            } catch (Exception e) {\n                // clear result variables\n                executionContext.getRuleResults().clear();\n\n                // add failed audit entry and rethrow\n                executionContext.getAuditContainer().addOutputEntry(ruleNumber, outputEntryExpression.getId(), getExceptionMessage(e), executionVariable);\n                throw new FlowableException(getExceptionMessage(e), e);\n            }","sourceCodeStart":253,"sourceCodeEnd":289,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java#L253-L289","documentation":"In RuleEngineExecutorImpl.composeOutputEntryResult, the DMN engine evaluates an output entry expression and converts the result into an execution variable. If the resulting executionVariable is null (expression evaluated to nothing / conversion produced null), the engine cannot create a conclusion result and logs this warning; audit/decision results will lack that output entry.","triggerScenarios":"Executing a decision table (executeOutputEntryAction) where an output entry expression evaluates to null or fails type conversion, e.g. hit policy expects a value but the expression returns nothing, or the output variable type does not match the evaluated value.","commonSituations":"DMN output expressions referencing missing input data (FEEL/JUEL evaluation yielding null); output type declared as long/date while the expression returns a string that cannot convert; hit-policies (e.g. single) combined with conditional outputs that don't fire; empty cells in decision table output columns.","solutions":["Check the DMN decision table: ensure the output entry expression actually produces a value for the matching rule, or mark the output as conditional/optional.","Verify output variable type (outputVariableType) matches the expression result type; fix the DMN model's type declarations.","Enable debug logging ('Created conclusion result') on passing rules to compare with the failing one and find which expression returns null.","Ensure required input variables are set on the DecisionExecution/variables map so output expressions don't evaluate to null.","Wrap the failing expression defensively in the DMN model (e.g. defaults) or provide a fallback output value in the rule."],"exampleFix":"// before (DMN output expression may yield nothing)\n<outputEntry expressionLanguage=\"juel\"><text>someOptionalValue</text></outputEntry>\n// after (provide a default)\n<outputEntry expressionLanguage=\"juel\"><text>someOptionalValue != null ? someOptionalValue : 'default'</text></outputEntry>","handlingStrategy":"validation","validationCode":"// before executeDecision: verify all inputs used by output entries are present and non-null\nfor (String required : List.of(\"amount\", \"riskScore\")) {\n    if (variables.get(required) == null) throw new IllegalArgumentException(\"Missing DMN input: \" + required);\n}","typeGuard":"boolean hasConclusion(DecisionService decisionService, String decisionKey, Map<String,Object> vars) {\n    List<Map<String,Object>> results = decisionService.executeDecisionWithVariables(decisionKey, vars)\n        .getRuleExecutions(); // then check each rule's output entries are non-null before use\n    return results != null && results.stream().allMatch(r -> r.get(\"output\") != null);\n}","tryCatchPattern":"try {\n    DecisionExecutionAuditContainer audit = decisionService.executeDecisionWithAuditContainer(key, vars);\n    if (audit.getDecisionResult() == null || audit.getDecisionResult().isEmpty()) {\n        LOGGER.warn(\"No conclusion result produced; check output entries and types\");\n    }\n} catch (FlowableException e) {\n    LOGGER.error(\"DMN execution failed\", e);\n}","preventionTips":["Declare output variable types consistent with expression results in the decision table.","Avoid empty/conditional output cells with single hit policies, or model them as optional outputs.","Test decision tables with representative inputs in CI using Flowable's DMN test support.","Check audit container results for null outputs instead of assuming every matched rule yields a value."],"tags":["dmn","decision-table","null-value","expression-evaluation"],"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-18T11:17:12.947Z"}