{"record":{"id":"7eaa935d06c2eb1c","repo":"flowable/flowable-engine","slug":"no-decision-table-present-in-decision","errorCode":null,"errorMessage":"no decision table present in decision","messagePattern":"no decision table present in decision","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java","lineNumber":82,"sourceCode":"        this.objectMapper = objectMapper;\n        this.dmnEngineConfiguration = dmnEngineConfiguration;\n    }\n\n    /**\n     * Executes the given decision and creates the outcome results\n     *\n     * @param decision            the DMN decision\n     * @param executeDecisionInfo\n     * @return updated execution variables map\n     */\n    @Override\n    public DecisionExecutionAuditContainer execute(Decision decision, ExecuteDecisionContext executeDecisionInfo) {\n        if (decision == null) {\n            throw new IllegalArgumentException(\"no decision provided\");\n        }\n\n        if (decision.getExpression() == null || !(decision.getExpression() instanceof DecisionTable currentDecisionTable)) {\n            throw new IllegalArgumentException(\"no decision table present in decision\");\n        }\n\n        // create execution context and audit trail\n        ELExecutionContext executionContext = ELExecutionContextBuilder.build(decision, executeDecisionInfo);\n\n        try {\n            sanityCheckDecisionTable(currentDecisionTable);\n\n            // evaluate decision table\n            evaluateDecisionTable(currentDecisionTable, executionContext);\n\n        } catch (FlowableException fe) {\n            LOGGER.error(\"decision table execution sanity check failed\", fe);\n            executionContext.getAuditContainer().setFailedWithException(fe);\n            executionContext.getAuditContainer().setExceptionMessage(getExceptionMessage(fe));\n\n        } finally {\n            // end audit trail","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java#L64-L100","documentation":"Flowable's DMN rule engine refuses to execute a Decision whose expression is either null or not a DecisionTable instance. RuleEngineExecutorImpl.execute() only supports decision-table decisions; a Decision backed by any other expression type (or an empty/incorrectly deployed decision) fails this instanceof guard at RuleEngineExecutorImpl.java:81-83. Because it is an IllegalArgumentException thrown before the try block, it propagates straight to the caller instead of being recorded in the audit container.","triggerScenarios":"Calling DmnEngine.executeDecision / RuleEngineExecutor.execute(decision, executeDecisionInfo) where decision.getExpression() returns null, or returns a non-DecisionTable expression (e.g. the decision in the deployed DMN XML is a decision defined without a decision table, or the Decision model was assembled programmatically without setting a DecisionTable expression).","commonSituations":"Deploying a DMN XML file whose <decision> element has no <decisionTable> child (e.g. only a literal expression), loading a Decision from a partially converted/parsed model, passing a hand-built Decision object to the executor in tests, or fetching a decision from the repository whose definition failed to convert to a decision table on an older Flowable version.","solutions":["Verify the deployed DMN resource actually contains a <decisionTable> inside the decision (open the .dmn XML and check), then redeploy it.","Check that the decision you pass to execute comes from DmnRepositoryService via createDecisionQuery / deployment, not a manually constructed Decision with no expression set.","If you need non-tabular decisions, do not call this executor; use the appropriate API or add a decision table to the model.","Inspect ELExecutionContextBuilder/decision conversion for your Flowable version — older DMN models may need re-export from the DMN modeler."],"exampleFix":"// before\nDecision decision = new Decision();\nauditContainer = ruleEngineExecutor.execute(decision, ctx); // throws: no expression\n// after\nDecision decision = new Decision();\nDecisionTable table = new DecisionTable();\ntable.setRules(rules);\ndecision.setExpression(table);\nauditContainer = ruleEngineExecutor.execute(decision, ctx);","handlingStrategy":"validation","validationCode":"if (decision == null || !(decision.getExpression() instanceof DecisionTable)) {\n    throw new IllegalStateException(\"decision is not backed by a decision table; check the deployed .dmn resource\");\n}","typeGuard":"boolean isDecisionTableDecision(Decision d) {\n    return d != null && d.getExpression() instanceof DecisionTable;\n}","tryCatchPattern":null,"preventionTips":["Always deploy decisions via DmnRepositoryService and fetch them by query rather than constructing Decision objects by hand.","Open the deployed .dmn XML and confirm the <decision> contains a <decisionTable> element.","Pin and test your DMN modeler export pipeline; re-export models after Flowable upgrades."],"tags":["dmn","java","validation","decision-table"],"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"}