{"record":{"id":"c779ccfa123264c1","repo":"flowable/flowable-engine","slug":"input-entry-is-required","errorCode":null,"errorMessage":"input entry is required","messagePattern":"input entry is required","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/el/ELExpressionExecutor.java","lineNumber":40,"sourceCode":"import org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * @author Yvo Swillens\n */\npublic class ELExpressionExecutor {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(ELExpressionExecutor.class);\n\n    public static Boolean executeInputExpression(InputClause inputClause, UnaryTests inputEntry, ExpressionManager expressionManager, ELExecutionContext executionContext) {\n        if (inputClause == null) {\n            throw new IllegalArgumentException(\"input clause is required\");\n        }\n        if (inputClause.getInputExpression() == null) {\n            throw new IllegalArgumentException(\"input expression is required\");\n        }\n        if (inputEntry == null) {\n            throw new IllegalArgumentException(\"input entry is required\");\n        }\n        if (executionContext == null) {\n            throw new IllegalArgumentException(\"execution context is required\");\n        }\n        \n        String inputExpression = inputClause.getInputExpression().getText();\n        executionContext.checkExecutionContext(inputExpression);\n        \n        // pre parse expression\n        String parsedExpression = ELInputEntryExpressionPreParser.parse(inputEntry.getText(), inputExpression, inputClause.getInputExpression().getTypeRef());\n\n        Expression expression = expressionManager.createExpression(parsedExpression);\n        RuleExpressionCondition condition = new RuleExpressionCondition(expression);\n        \n        try {\n            return condition.evaluate(executionContext.getStackVariables(), executionContext);\n        } catch (Exception ex) {\n            LOGGER.warn(\"Error while executing input entry: {}\", parsedExpression, ex);","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/el/ELExpressionExecutor.java#L22-L58","documentation":"Thrown by ELExpressionExecutor.executeInputExpression when the inputEntry (UnaryTests) argument is null. The input entry holds the test expression that decides whether a rule row matches; without it the condition cannot be created, so the executor rejects the call immediately with an IllegalArgumentException.","triggerScenarios":"Passing null as the second argument to ELExpressionExecutor.executeInputExpression — e.g. a rule row cell for that input column is absent or the parser produced no UnaryTests object for it.","commonSituations":"Custom decision-table evaluators iterating rule rows where some cells are empty/unparsed; DMN XML rule rows with fewer entries than input clauses; test code calling the executor with placeholder nulls.","solutions":["Provide a valid UnaryTests object (with getText() returning the test expression, e.g. \"\" or a literal) instead of null.","Verify every rule row in the decision table has one entry per input clause and fix the model/XML or row-mapping code.","If empty cells are legitimate, substitute an empty UnaryTests before calling rather than passing null.","Guard each argument for null before invoking the executor and skip or log the rule instead."],"exampleFix":"// before\nUnaryTests inputEntry = rule.getInputEntries().get(i); // may be null\nBoolean hit = ELExpressionExecutor.executeInputExpression(clause, inputEntry, em, ctx);\n// after\nUnaryTests inputEntry = rule.getInputEntries().get(i);\nif (inputEntry != null) {\n    Boolean hit = ELExpressionExecutor.executeInputExpression(clause, inputEntry, em, ctx);\n} else {\n    // skip missing entry or substitute empty UnaryTests\n}","handlingStrategy":"validation","validationCode":"if (inputEntry == null) {\n    // skip rule, substitute empty UnaryTests, or raise a validation error\n}","typeGuard":"boolean hasInputEntry(UnaryTests e) { return e != null; }","tryCatchPattern":"try {\n    ELExpressionExecutor.executeInputExpression(clause, entry, em, ctx);\n} catch (IllegalArgumentException e) {\n    if (\"input entry is required\".equals(e.getMessage())) {\n        // rule row is missing an input entry: report row/clause index\n    } else { throw e; }\n}","preventionTips":["Ensure every rule row has one input entry per input clause","Validate decision-table shape (rows x columns) before evaluation","Substitute empty UnaryTests for intentionally blank cells","Null-check entries in custom evaluators before calling the executor"],"tags":["java","dmn","null-argument","expression-evaluation"],"backgroundTag":"null-argument","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"}