flowable/flowable-engine · error · IllegalArgumentException

input expression is required

Error message

input expression is required

What it means

Thrown by ELExpressionExecutor.executeInputExpression when the InputClause argument is non-null but its getInputExpression() returns null. An input clause must carry the input expression (the FEEL/EL expression describing the hit policy input); without it the engine cannot build or evaluate the rule condition, so it fails fast with an IllegalArgumentException.

Source

Thrown at modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/el/ELExpressionExecutor.java:37

import org.flowable.dmn.model.LiteralExpression;
import org.flowable.dmn.model.OutputClause;
import org.flowable.dmn.model.UnaryTests;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Yvo Swillens
 */
public class ELExpressionExecutor {

    private static final Logger LOGGER = LoggerFactory.getLogger(ELExpressionExecutor.class);

    public static Boolean executeInputExpression(InputClause inputClause, UnaryTests inputEntry, ExpressionManager expressionManager, ELExecutionContext executionContext) {
        if (inputClause == null) {
            throw new IllegalArgumentException("input clause is required");
        }
        if (inputClause.getInputExpression() == null) {
            throw new IllegalArgumentException("input expression is required");
        }
        if (inputEntry == null) {
            throw new IllegalArgumentException("input entry is required");
        }
        if (executionContext == null) {
            throw new IllegalArgumentException("execution context is required");
        }
        
        String inputExpression = inputClause.getInputExpression().getText();
        executionContext.checkExecutionContext(inputExpression);
        
        // pre parse expression
        String parsedExpression = ELInputEntryExpressionPreParser.parse(inputEntry.getText(), inputExpression, inputClause.getInputExpression().getTypeRef());

        Expression expression = expressionManager.createExpression(parsedExpression);
        RuleExpressionCondition condition = new RuleExpressionCondition(expression);
        
        try {

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Set the input expression on the clause before executing: inputClause.setInputExpression(literalExpression) with a non-null LiteralExpression.
  2. Inspect the DMN XML/model for <input> elements missing their <inputExpression> child and fix the model or the producing tool.
  3. If the clause comes from a converter, check that it maps the source model's input expression into the Flowable DMN model.
  4. Null-check the clause's input expression before invoking executeInputExpression and fail with a clear message at your boundary.

Example fix

// before
InputClause clause = new InputClause();
clause.setInputEntryValues(...);
Boolean hit = ELExpressionExecutor.executeInputExpression(clause, inputEntry, em, ctx);
// after
InputClause clause = new InputClause();
LiteralExpression inputExpr = new LiteralExpression();
inputExpr.setText("amount");
clause.setInputExpression(inputExpr);
Boolean hit = ELExpressionExecutor.executeInputClauseGuarded(clause, inputEntry, em, ctx);
Defensive patterns

Strategy: validation

Validate before calling

if (inputClause == null || inputClause.getInputExpression() == null) {
    throw new IllegalStateException("DMN input clause has no input expression; fix the model before evaluation");
}

Type guard

boolean hasInputExpression(InputClause c) { return c != null && c.getInputExpression() != null; }

Try / catch

try {
    ELExpressionExecutor.executeInputExpression(clause, entry, em, ctx);
} catch (IllegalArgumentException e) {
    if ("input expression is required".equals(e.getMessage())) {
        // report malformed DMN model: missing input expression on clause
    } else { throw e; }
}

Prevention

When it happens

Trigger: Calling ELExpressionExecutor.executeInputExpression with an InputClause whose inputExpression field was never set — typically a programmatically built decision table or a partially parsed DMN model where the <inputExpression> element is missing from the <input> clause.

Common situations: Hand-constructing InputClause objects in unit tests or custom DMN tooling without calling setInputExpression; a malformed/incomplete DMN XML where the input element omits its child inputExpression; custom model converters that copy clauses but drop the expression.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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