{"record":{"id":"cd0276f566c5ad7e","repo":"flowable/flowable-engine","slug":"no-case-definition-deployed-with-key-casedefin","errorCode":null,"errorMessage":"no case definition deployed with key = '<caseDefinitionKey>' and version = '<caseDefinitionVersion>'","messagePattern":"no case definition deployed with key = '<caseDefinitionKey>' and version = '<caseDefinitionVersion>'","errorType":"exception","errorClass":"FlowableObjectNotFoundException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/deployer/CmmnDeploymentManager.java","lineNumber":99,"sourceCode":"        }\n        caseDefinition = resolveCaseDefinition(caseDefinition).getCaseDefinition();\n        return caseDefinition;\n    }\n\n    public CaseDefinition findDeployedLatestCaseDefinitionByKeyAndTenantId(String caseDefinitionKey, String tenantId) {\n        CaseDefinition caseDefinition = caseDefinitionEntityManager.findLatestCaseDefinitionByKeyAndTenantId(caseDefinitionKey, tenantId);\n        if (caseDefinition == null) {\n            throw new FlowableObjectNotFoundException(\"no case definition deployed with key '\" + caseDefinitionKey + \"' for tenant identifier '\" + tenantId + \"'\", CaseDefinition.class);\n        }\n        caseDefinition = resolveCaseDefinition(caseDefinition).getCaseDefinition();\n        return caseDefinition;\n    }\n\n    public CaseDefinition findDeployedCaseDefinitionByKeyAndVersionAndTenantId(String caseDefinitionKey, Integer caseDefinitionVersion, String tenantId) {\n        CaseDefinition caseDefinition = (CaseDefinitionEntity) caseDefinitionEntityManager\n                .findCaseDefinitionByKeyAndVersionAndTenantId(caseDefinitionKey, caseDefinitionVersion, tenantId);\n        if (caseDefinition == null) {\n            throw new FlowableObjectNotFoundException(\"no case definition deployed with key = '\" + caseDefinitionKey + \"' and version = '\" + caseDefinitionVersion + \"'\", CaseDefinition.class);\n        }\n        caseDefinition = resolveCaseDefinition(caseDefinition).getCaseDefinition();\n        return caseDefinition;\n    }\n\n    public CaseDefinitionCacheEntry resolveCaseDefinition(CaseDefinition caseDefinition) {\n        String caseDefinitionId = caseDefinition.getId();\n        String deploymentId = caseDefinition.getDeploymentId();\n\n        CaseDefinitionCacheEntry cachedCaseDefinition = caseDefinitionCache.get(caseDefinitionId);\n\n        if (cachedCaseDefinition == null) {\n            CmmnDeploymentEntity deployment = deploymentEntityManager.findById(deploymentId);\n            deployment.setNew(false);\n            deploy(deployment, null);\n            cachedCaseDefinition = deployment.getCaseDefinitionCacheEntry(caseDefinitionId);\n\n            if (cachedCaseDefinition == null) {","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/deployer/CmmnDeploymentManager.java#L81-L117","documentation":"findDeployedCaseDefinitionByKeyAndVersionAndTenantId looks up a specific version of a case definition by key, version and tenant. When the database has no matching row it throws FlowableObjectNotFoundException. Note the message omits the tenant, which can mislead when the tenant constraint is the actual reason for the miss.","triggerScenarios":"Requesting a version that was never deployed or was removed (cascade delete of a deployment), with an exact-version pin (e.g. version=3) while only versions 1-2 exist; tenant mismatch not visible in the message.","commonSituations":"Pinning version numbers in config after a redeploy reset versions; deleting old deployments then falling back to a pinned old version; environment-specific tenants differing between staging and prod.","solutions":["Confirm available versions via createCaseDefinitionQuery().caseDefinitionKey(key).list() and use an existing version","Use latestVersion() resolution instead of pinning an exact version","Check the tenantId parameter too, since it is part of the lookup but not the error message"],"exampleFix":"// before\nmanagementService // or repository lookup\n    ...findCaseDefinitionByKeyAndVersionAndTenantId(\"credit\", 3, \"acme\"); // only v2 deployed\n// after\n...findCaseDefinitionByKeyAndVersionAndTenantId(\"credit\", 2, \"acme\");","handlingStrategy":"validation","validationCode":"List<CaseDefinition> defs = repositoryService.createCaseDefinitionQuery().caseDefinitionKey(key).caseDefinitionTenantId(tenantId).orderByCaseDefinitionVersion().desc().list(); // pick an existing version","typeGuard":null,"tryCatchPattern":"try { def = lookupByKeyVersionTenant(key, version, tenant); } catch (FlowableObjectNotFoundException e) { def = latestAvailable(key, tenant); }","preventionTips":["Avoid pinning exact versions in config; use latest resolution","Check tenantId when an exact-version lookup unexpectedly misses"],"tags":["not-found","versioning","case-definition"],"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"}