{"record":{"id":"e3b5aee2e865083c","repo":"flowable/flowable-engine","slug":"no-decision-found-for-key-decisionkey-parent-de","errorCode":null,"errorMessage":"No decision found for key <decisionKey>, parent deployment id <parentDeploymentId> and tenant id: <tenantId>. There was also no fall back decision found without parent deployment id.","messagePattern":"No decision found for key <decisionKey>, parent deployment id <parentDeploymentId> and tenant id: <tenantId>\\. There was also no fall back decision found without parent deployment id\\.","errorType":"exception","errorClass":"FlowableObjectNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/cmd/AbstractExecuteDecisionCmd.java","lineNumber":112,"sourceCode":"                    if (executeDecisionContext.isFallbackToDefaultTenant() || dmnEngineConfiguration.isFallbackToDefaultTenant()) {\n                        String defaultTenant = dmnEngineConfiguration.getDefaultTenantProvider().getDefaultTenant(tenantId, ScopeTypes.DMN, decisionKey);\n                        if (StringUtils.isNotEmpty(defaultTenant)) {\n                            decision = decisionEntityManager.findLatestDecisionByKeyAndTenantId(decisionKey, defaultTenant);\n                            if (decision == null) {\n                                throw new FlowableObjectNotFoundException(\"No decision found for key: \" + decisionKey +\n                                    \". There was also no fall back decision found for default tenant \" + defaultTenant);\n                            }\n                            \n                        } else {\n                            decision = decisionEntityManager.findLatestDecisionByKey(decisionKey);\n                            if (decision == null) {\n                                throw new FlowableObjectNotFoundException(\"No decision found for key: \" + decisionKey +\n                                    \". There was also no fall back decision table found without tenant.\");\n                            }\n                        }\n                        \n                    } else {\n                        throw new FlowableObjectNotFoundException(\"No decision found for key: \" + decisionKey +\n                            \", parent deployment id \" + parentDeploymentId + \" and tenant id: \" + tenantId +\n                            \". There was also no fall back decision found without parent deployment id.\");\n                    }\n                }\n            }\n            \n        } else if (StringUtils.isNotEmpty(decisionKey) && StringUtils.isNotEmpty(parentDeploymentId) &&\n                        !dmnEngineConfiguration.isAlwaysLookupLatestDefinitionVersion()) {\n            \n            List<DmnDeployment> dmnDeployments = CommandContextUtil.getDeploymentEntityManager().findDeploymentsByQueryCriteria(\n                new DmnDeploymentQueryImpl().parentDeploymentId(parentDeploymentId));\n\n            if (dmnDeployments != null && dmnDeployments.size() != 0) {\n                decision = decisionEntityManager.findDecisionByDeploymentAndKey(dmnDeployments.get(0).getId(), decisionKey);\n            }\n\n            if (decision == null) {\n                // If there is no decision table found linked to the deployment id, try to find one without a specific deployment id.","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/cmd/AbstractExecuteDecisionCmd.java#L94-L130","documentation":"Flowable DMN throws this FlowableObjectNotFoundException when resolving a decision by key, parent deployment id and tenant id finds no matching Decision row in the DMN repository, and a fallback lookup without the parent deployment id also fails. The engine cannot locate any deployed decision for the given key/tenant combination, so decision execution is aborted before planning.","triggerScenarios":"Calling the DMN engine (e.g. ExecuteDecisionCmd via DmnEngineService or a rule task) with decisionKey set, a non-empty parentDeploymentId and tenantId, where neither findDecisionByKeyParentDeploymentIdAndTenantId nor the fallback findLatestDecisionByKeyAndTenantId returns a row.","commonSituations":"Decision not deployed to the tenant's deployments; tenant id typo; decision deployed only under a different parent deployment (e.g. process app) id; cascade deployment removed the decision; fallback-to-default-tenant disabled while the decision lives under the default tenant.","solutions":["Verify with a repository query that a Decision row exists for the given key and tenantId (ACT_DMN_DECISION / DmnRepositoryService.createDecisionQuery().decisionKey(...).tenantId(...)).","Remove or correct parentDeploymentId so the lookup falls back to latest-by-key-and-tenant, or pass the correct parent deployment id the decision was deployed with.","Correct the tenantId (or deploy the decision under the expected tenant) so the tenant-scoped query matches.","Enable fallbackToDefaultTenant in DmnEngineConfiguration if the decision should be resolved from the default tenant.","Redeploy the DMN resource (.dmn.xml) to the target tenant/deployment."],"exampleFix":"// before\ndmnEngine.executeDecision(new ExecuteDecisionBuilderImpl().decisionKey(\"myDecision\").parentDeploymentId(\"dep-123\").tenantId(\"wrong-tenant\"));\n// after\nDmnRepositoryService repo = dmnEngine.getDmnRepositoryService();\nif (repo.createDecisionQuery().decisionKey(\"myDecision\").tenantId(\"acme\").count() == 0) {\n    repo.createDeployment().addClasspathResource(\"diagrams/myDecision.dmn\").tenantId(\"acme\").deploy();\n}\ndmnEngine.executeDecision(new ExecuteDecisionBuilderImpl().decisionKey(\"myDecision\").tenantId(\"acme\"));","handlingStrategy":"validation","validationCode":"long count = dmnRepositoryService.createDecisionQuery().decisionKey(key).parentDeploymentId(parentDepId).tenantId(tenantId).count();\nif (count == 0 && dmnRepositoryService.createDecisionQuery().decisionKey(key).tenantId(tenantId).count() == 0) {\n    throw new IllegalStateException(\"Decision \" + key + \" not deployed for tenant \" + tenantId);\n}","typeGuard":null,"tryCatchPattern":"try { dmnEngine.executeDecision(builder.decisionKey(key).parentDeploymentId(dep).tenantId(tenant)); }\ncatch (FlowableObjectNotFoundException e) { log.error(\"Decision {} missing for tenant {}\", key, tenant, e); deployDecision(key, tenant); }","preventionTips":["Deploy DMN resources per tenant as part of environment setup","Validate key/tenant existence with a DecisionQuery before execution","Keep parentDeploymentId usage minimal; prefer key+tenant resolution","Enable fallbackToDefaultTenant where cross-tenant resolution is acceptable"],"tags":["dmn","tenant","deployment","not-found"],"backgroundTag":"resource-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}