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

  1. Read the wrapped cause (e.getCause()) to find the actual expression failure
  2. Fix or validate the output entry expression syntax in the DMN table
  3. Ensure all variables referenced by the expression are provided to the DMN engine
  4. 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

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/7112fc15be52f76b. Report an issue: GitHub.