{"record":{"id":"8200aee4507bae00","repo":"flowable/flowable-engine","slug":"case-definition-with-key-casedefinitionkey-an","errorCode":null,"errorMessage":"Case definition with key '${caseDefinitionKey}' and tenantId '${tenantId}' was not found.","messagePattern":"Case definition with key '(.+?)' and tenantId '(.+?)' was not found\\.","errorType":"exception","errorClass":"FlowableObjectNotFoundException","httpStatus":404,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/AbstractCaseStartEventSubscriptionCmd.java","lineNumber":100,"sourceCode":"\n            if (caseDefinition == null) {\n                CmmnEngineConfiguration caseEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration(commandContext);\n                if (caseEngineConfiguration.isFallbackToDefaultTenant()) {\n                    String defaultTenant = caseEngineConfiguration.getDefaultTenantProvider().getDefaultTenant(tenantId, ScopeTypes.BPMN, caseDefinitionKey);\n                    if (StringUtils.isNotEmpty(defaultTenant)) {\n                        caseDefinition = caseDefinitionEntityManager.findLatestCaseDefinitionByKeyAndTenantId(caseDefinitionKey, defaultTenant);\n                        \n                    } else {\n                        caseDefinition = caseDefinitionEntityManager.findLatestCaseDefinitionByKey(caseDefinitionKey);\n                    }\n                    \n                    if (caseDefinition == null) {\n                        throw new FlowableObjectNotFoundException(\"No case definition found for key '\" + caseDefinitionKey +\n                            \"'. Fallback to default tenant was also applied.\", CaseDefinition.class);\n                    }\n                    \n                } else {\n                    throw new FlowableObjectNotFoundException(\"Case definition with key '\" + caseDefinitionKey +\n                        \"' and tenantId '\" + tenantId + \"' was not found.\", CaseDefinition.class);\n                }\n            }\n        }\n        \n        if (caseDefinition == null) {\n            throw new FlowableIllegalArgumentException(\"No deployed case definition found for key '\" + caseDefinitionKey + \"'.\");\n        }\n        \n        return caseDefinition;\n    }\n\n    protected CaseDefinition getCaseDefinitionById(String caseDefinitionId, CommandContext commandContext) {\n        CmmnRepositoryService repositoryService = CommandContextUtil.getCmmnEngineConfiguration(commandContext).getCmmnRepositoryService();\n\n        CaseDefinition caseDefinition = repositoryService.createCaseDefinitionQuery()\n            .caseDefinitionId(caseDefinitionId)\n            .singleResult();","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/AbstractCaseStartEventSubscriptionCmd.java#L82-L118","documentation":"FlowableObjectNotFoundException thrown when the tenant-specific lookup finds no case definition for the given key+tenantId and fallback to the default tenant is not applicable/attempted (the else branch). Unlike 332, no default-tenant fallback result exists because the fallback branch was not reached.","triggerScenarios":"getLatestCaseDefinitionByKey(key, tenantId, ctx) with non-null tenantId (not NO_TENANT_ID) where findLatestCaseDefinitionByKeyAndTenantId(key, tenantId) returns null and the code takes the else branch directly.","commonSituations":"Deployments exist but are registered under a different tenantId than the one sent by the client; tenantId casing/whitespace mismatch; multi-tenant environment where the definition was never replicated to the requested tenant.","solutions":["Match the tenantId exactly to the tenant used at deployment time (check whitespace/casing).","Deploy the CMMN model with the correct tenantId annotation or deploy via the tenant-aware repository API.","If the definition should be tenant-independent, deploy without a tenant and use NO_TENANT_ID."],"exampleFix":"// before\nbuilder.caseDefinitionKey(\"order-case\").caseDefinitionTenantId(\"acme\"); // deployed tenant is 'ACME'\n// after\nbuilder.caseDefinitionKey(\"order-case\").caseDefinitionTenantId(\"ACME\");","handlingStrategy":"validation","validationCode":"CaseDefinition cd = cmmnRepositoryService.createCaseDefinitionQuery()\n    .caseDefinitionKey(key).caseDefinitionTenantId(tenantId).latestVersion().singleResult();\nif (cd == null) throw new IllegalStateException(\"no case def for \" + key + \"@\" + tenantId);","typeGuard":null,"tryCatchPattern":"try { startForTenant(key, tenantId); }\ncatch (FlowableObjectNotFoundException e) { logAvailableTenants(key); throw e; }","preventionTips":["Always deploy with explicit tenantId matching runtime requests","Add a deployment smoke test per tenant in multi-tenant setups"],"tags":["cmmn","tenant","case-definition"],"backgroundTag":"record-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"}