{"record":{"id":"7112fc15be52f76b","repo":"flowable/flowable-engine","slug":"exception-message-from-output-expression-evaluati","errorCode":null,"errorMessage":"<exception message from output expression evaluation failure>","messagePattern":"<exception message from output expression evaluation failure>","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java","lineNumber":288,"sourceCode":"                } 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            }\n\n        } else {\n            LOGGER.debug(\"Expression is empty\");\n\n            // add empty audit entry\n            executionContext.getAuditContainer().addOutputEntry(ruleNumber, outputEntryExpression.getId(), null);\n        }\n\n        LOGGER.debug(\"End evaluation conclusion {} of valid rule {}\", ruleClauseContainer.getOutputClause().getOutputNumber(), ruleNumber);\n    }\n\n    protected String getExceptionMessage(Exception exception) {\n        Throwable rootCause = exception;\n        while (rootCause.getCause() != null) {\n            rootCause = rootCause.getCause();\n        }\n        return rootCause.getMessage();","sourceCodeStart":270,"sourceCodeEnd":306,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java#L270-L306","documentation":"Flowable DMN throws this when evaluating an output entry expression (the result cell of a rule) fails for any reason. The original exception message is captured into the audit container and rethrown wrapped in a FlowableException, so rule results are cleared and the failure is auditable.","triggerScenarios":"composeOutputEntryResult executes an output entry expression whose evaluation throws (e.g. invalid EL/JUEL syntax, missing referenced variables, type conversion failure in the output mapping); executeOutputEntryAction propagates it.","commonSituations":"Typos in expression variables, referencing input data not passed into the decision, output expression returning an incompatible type for the declared output typeRef, EL function not registered on the engine.","solutions":["Read the wrapped cause (e.getCause()) to find the actual expression failure","Fix or validate the output entry expression syntax in the DMN table","Ensure all variables referenced by the expression are provided to the DMN engine","Check the output typeRef matches the expression's result type; register any custom EL functions on the DMN engine config"],"exampleFix":"// before\n<outputEntry expression=\"${missingVar * 2}\"/>\n// after\n<outputEntry expression=\"${availableVar * 2}\"/> // or pass missingVar via dmnEngineRule.execute(...)","handlingStrategy":"try-catch","validationCode":"// before executing: ensure variables exist\nSet<String> needed = Set.of(\"availableVar\");\nneeded.forEach(v -> { if (!vars.containsKey(v)) throw new IllegalArgumentException(\"missing var: \" + v); });","typeGuard":null,"tryCatchPattern":"try { result = dmnEngine.executeDecisionByKey(key, vars); }\ncatch (FlowableException e) {\n  Throwable cause = e.getCause();\n  LOG.error(\"output entry evaluation failed: {}\", cause != null ? cause.getMessage() : e.getMessage());\n  // fix expression or variables and retry\n}","preventionTips":["Test DMN tables with the exact variable maps used in production","Keep output expressions simple; prefer precomputed variables","Register custom EL functions on DmnEngineConfiguration","Validate DMN XML at deploy time (strict mode)"],"tags":["dmn","expression-evaluation","flowable"],"backgroundTag":"expression-evaluation-failed","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"}