{"record":{"id":"f5eeee4cb75a722a","repo":"flowable/flowable-engine","slug":"no-decision-provided","errorCode":null,"errorMessage":"no decision provided","messagePattern":"no decision provided","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java","lineNumber":78,"sourceCode":"            ObjectMapper objectMapper, DmnEngineConfiguration dmnEngineConfiguration) {\n        \n        this.hitPolicyBehaviors = hitPolicyBehaviors;\n        this.expressionManager = expressionManager;\n        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);","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java#L60-L96","documentation":"java.lang.IllegalArgumentException thrown by RuleEngineExecutorImpl.execute(Decision, ExecuteDecisionContext) when the Decision argument is null. The rule engine executor cannot evaluate anything without a decision model, so it fails fast before attempting to resolve the decision table.","triggerScenarios":"Calling ruleEngineExecutor.execute(null, context) directly, or indirectly when a decision lookup by key/id (e.g. via DmnRepositoryService) returned null and the result was passed on without checking.","commonSituations":"Deployment mismatch: querying for a decision by key in a tenant where it was never deployed, so getDecisionById/getDecision returns null; typo in decision key; decision not deployed yet when an async job fires.","solutions":["Ensure the DMN decision is deployed: verify the .dmn.xml resource is included in the deployment and check dmnRepositoryService.createDeployment().deploy().","Resolve the Decision with dmnRepositoryService.getDecisionById(...) or a query and null-check the result before executing.","Verify the decision key/id spelling and that the correct tenant is being used in multi-tenant setups."],"exampleFix":"// before\nDecision decision = dmnRepositoryService.getDecisionById(decisionId);\nruleEngineExecutor.execute(decision, context);\n// after\nDecision decision = dmnRepositoryService.getDecisionById(decisionId);\nif (decision == null) {\n    throw new IllegalStateException(\"Decision not deployed: \" + decisionId);\n}\nruleEngineExecutor.execute(decision, context);","handlingStrategy":"validation","validationCode":"Decision decision = dmnRepositoryService.getDecisionById(decisionId);\nif (decision == null) {\n    throw new IllegalStateException(\"Decision not found: \" + decisionId);\n}\nruleEngineExecutor.execute(decision, executeDecisionInfo);","typeGuard":"boolean isExecutableDecision(Decision d) { return d != null && d.getExpression() instanceof DecisionTable; }","tryCatchPattern":"try {\n    ruleEngineExecutor.execute(decision, ctx);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"no decision\")) {\n        throw new IllegalStateException(\"Decision was not resolved/deployed before execution\", e);\n    }\n    throw e;\n}","preventionTips":["Always null-check results of decision lookups before executing.","Verify DMN deployments and decision keys at startup in integration tests.","In multi-tenant setups, resolve decisions with the correct tenant scoping."],"tags":["flowable","dmn","rule-engine","null-check","decision"],"backgroundTag":"missing-required-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}