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
- Set the input expression on the clause before executing: inputClause.setInputExpression(literalExpression) with a non-null LiteralExpression.
- Inspect the DMN XML/model for <input> elements missing their <inputExpression> child and fix the model or the producing tool.
- If the clause comes from a converter, check that it maps the source model's input expression into the Flowable DMN model.
- 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
- Always set an input expression on every InputClause before evaluation
- Validate the DMN model (presence of <inputExpression> in each <input>) before deploying/running
- In converters, assert each clause's expression is mapped, not dropped
- Fail fast with model-validation at deploy time rather than at evaluation time
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
- input entry is required
- execution context is required
- output clause is required
- output entry is required
- <exception message from evaluation failure>
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/4969f01a55a6ad12.
Report an issue: GitHub.