flowable/flowable-engine · error · FlowableException
<exception message from output expression evaluation failure
Error message
<exception message from output expression evaluation failure>
What it means
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.
Source
Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java:288
} else {
LOGGER.warn("Could not create conclusion result");
}
} catch (FlowableException ade) {
// clear result variables
executionContext.getRuleResults().clear();
// add failed audit entry and rethrow
executionContext.getAuditContainer().addOutputEntry(ruleNumber, outputEntryExpression.getId(), getExceptionMessage(ade), executionVariable);
throw ade;
} catch (Exception e) {
// clear result variables
executionContext.getRuleResults().clear();
// add failed audit entry and rethrow
executionContext.getAuditContainer().addOutputEntry(ruleNumber, outputEntryExpression.getId(), getExceptionMessage(e), executionVariable);
throw new FlowableException(getExceptionMessage(e), e);
}
} else {
LOGGER.debug("Expression is empty");
// add empty audit entry
executionContext.getAuditContainer().addOutputEntry(ruleNumber, outputEntryExpression.getId(), null);
}
LOGGER.debug("End evaluation conclusion {} of valid rule {}", ruleClauseContainer.getOutputClause().getOutputNumber(), ruleNumber);
}
protected String getExceptionMessage(Exception exception) {
Throwable rootCause = exception;
while (rootCause.getCause() != null) {
rootCause = rootCause.getCause();
}
return rootCause.getMessage();View on GitHub (pinned to d6d39ce1c6)
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
Example fix
// before
<outputEntry expression="${missingVar * 2}"/>
// after
<outputEntry expression="${availableVar * 2}"/> // or pass missingVar via dmnEngineRule.execute(...) Defensive patterns
Strategy: try-catch
Validate before calling
// before executing: ensure variables exist
Set<String> needed = Set.of("availableVar");
needed.forEach(v -> { if (!vars.containsKey(v)) throw new IllegalArgumentException("missing var: " + v); }); Try / catch
try { result = dmnEngine.executeDecisionByKey(key, vars); }
catch (FlowableException e) {
Throwable cause = e.getCause();
LOG.error("output entry evaluation failed: {}", cause != null ? cause.getMessage() : e.getMessage());
// fix expression or variables and retry
} Prevention
- 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)
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- error while executing input entry
- error while executing output entry
- Cannot find case definition for id:
- DMN repository service is not available
- Dmn engine is not configured
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/7112fc15be52f76b.
Report an issue: GitHub.