{"record":{"id":"e743a0c980b12e47","repo":"flowable/flowable-engine","slug":"no-decision-deployed-with-key-definitionkey","errorCode":null,"errorMessage":"no decision deployed with key = '${definitionKey}' and version = '${definitionVersion}'","messagePattern":"no decision deployed with key = '(.+?)' and version = '(.+?)'","errorType":"exception","errorClass":"FlowableObjectNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/persistence/deploy/DeploymentManager.java","lineNumber":128,"sourceCode":"    }\n\n    public DecisionEntity findDeployedLatestDecisionByKeyDeploymentIdAndTenantId(String definitionKey,\n            String deploymentId, String tenantId) {\n        DecisionEntity definition = decisionEntityManager.findDecisionByDeploymentAndKeyAndTenantId(deploymentId, definitionKey, tenantId);\n\n        if (definition == null) {\n            throw new FlowableObjectNotFoundException(\"no decisions deployed with key '\" + definitionKey +\n                            \"' for deployment id '\" + deploymentId + \"' and tenant identifier \" + tenantId);\n        }\n        definition = resolveDecision(definition).getDecisionEntity();\n        return definition;\n    }\n\n    public DecisionEntity findDeployedDefinitionByKeyAndVersionAndTenantId(String definitionKey, int definitionVersion, String tenantId) {\n        DecisionEntity definition = decisionEntityManager.findDecisionByKeyAndVersionAndTenantId(definitionKey, definitionVersion, tenantId);\n\n        if (definition == null) {\n            throw new FlowableObjectNotFoundException(\"no decision deployed with key = '\" + definitionKey + \"' and version = '\" + definitionVersion + \"'\");\n        }\n\n        definition = resolveDecision(definition).getDecisionEntity();\n        return definition;\n    }\n\n    /**\n     * Resolving the decision will fetch the DMN, parse it and store the {@link org.flowable.dmn.model.DmnDefinition} in memory.\n     */\n    public DecisionCacheEntry resolveDecision(DmnDecision decision) {\n        String decisionId = decision.getId();\n        String deploymentId = decision.getDeploymentId();\n\n        DecisionCacheEntry cachedDecision = decisionCache.get(decisionId);\n\n        if (cachedDecision == null) {\n            DmnDeploymentEntity deployment = engineConfig.getDeploymentEntityManager().findById(deploymentId);\n            List<DmnResourceEntity> resources = engineConfig.getResourceEntityManager().findResourcesByDeploymentId(deploymentId);","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/persistence/deploy/DeploymentManager.java#L110-L146","documentation":"findDeployedDefinitionByKeyAndVersionAndTenantId throws FlowableObjectNotFoundException('no decision deployed with key = ... and version = ...') when the exact key+version pair has no decision row. Unlike the latest-version lookups, an older or newer version will not satisfy it.","triggerScenarios":"Pinning execution to an explicit decision version that was never deployed, or that was removed by a later deployment deletion.","commonSituations":"Hard-coded version numbers in configuration that drift after redeploys; tests expecting version 1 after the definition was redeployed (now version 2); deleting an old deployment that contained the pinned version.","solutions":["Check available versions: createDecisionQuery().decisionKey(key).list() and use an existing versionValue.","Switch to latest-version lookup (findDeployedLatestDefinitionByKey) if you don't need a pinned version.","Redeploy the DMN resource so the requested version exists again."],"exampleFix":"// before\nDecisionEntity d = manager.findDeployedDefinitionByKeyAndVersionAndTenantId(\"approveOrder\", 1, null); // v1 gone\n// after\nDmnDecision latest = dmnRepositoryService.createDecisionQuery().latest().decisionKey(\"approveOrder\").singleResult();\nint version = latest != null ? latest.getVersion() : 1;\nDecisionEntity d = manager.findDeployedDefinitionByKeyAndVersionAndTenantId(\"approveOrder\", version, null);","handlingStrategy":"validation","validationCode":"boolean versionExists = dmnRepositoryService.createDecisionQuery()\n    .decisionKey(key).decisionVersion(version).tenantId(tenantId).count() > 0;","typeGuard":null,"tryCatchPattern":"try { return manager.findDeployedDefinitionByKeyAndVersionAndTenantId(key, version, tenantId); } catch (FlowableObjectNotFoundException e) { throw new IllegalStateException(\"decision \" + key + \" v\" + version + \" not deployed\", e); }","preventionTips":["Avoid hard-coded version numbers; resolve latest and read its version","Never delete deployments containing versions still pinned by callers","Track version drift after each redeploy in tests"],"tags":["flowable-dmn","not-found","versioning","decision-key"],"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-18T11:17:12.947Z"}