{"record":{"id":"e52339db7593a6f1","repo":"flowable/flowable-engine","slug":"no-event-definition-found-for-key-eventdefiniti-e52339","errorCode":null,"errorMessage":"No event definition found for key '${eventDefinitionKey} for parent deployment id '${parentDeploymentId}' and for tenant identifier ${tenantId}","messagePattern":"No event definition found for key '(.+?) for parent deployment id '(.+?)' and for tenant identifier (.+?)","errorType":"exception","errorClass":"FlowableObjectNotFoundException","httpStatus":404,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/cmd/GetEventModelCmd.java","lineNumber":139,"sourceCode":"                eventDefinitionEntity = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKeyAndTenantId(\n                                eventDeployments.get(0).getId(), eventDefinitionKey, tenantId);\n            }\n            \n            if (eventDefinitionEntity == null) {\n                eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKeyAndTenantId(eventDefinitionKey, tenantId);\n            }\n            \n            if (eventDefinitionEntity == null && eventEngineConfiguration.isFallbackToDefaultTenant()) {\n                String defaultTenant = eventEngineConfiguration.getDefaultTenantProvider().getDefaultTenant(tenantId, ScopeTypes.EVENT_REGISTRY, eventDefinitionKey);\n                if (StringUtils.isNotEmpty(defaultTenant)) {\n                    eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKeyAndTenantId(eventDefinitionKey, defaultTenant);\n                } else {\n                    eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKey(eventDefinitionKey);\n                }\n            }\n            \n            if (eventDefinitionEntity == null) {\n                throw new FlowableObjectNotFoundException(\"No event definition found for key '\" + eventDefinitionKey +\n                        \" for parent deployment id '\" + parentDeploymentId + \"' and for tenant identifier \" + tenantId, EventDefinitionEntity.class);\n            }\n\n        } else {\n            throw new FlowableObjectNotFoundException(\"eventDefinitionKey and eventDefinitionId are null\");\n        }\n\n        EventDefinitionCacheEntry eventDefinitionCacheEntry = deploymentManager.resolveEventDefinition(eventDefinitionEntity);\n        return eventEngineConfiguration.getEventJsonConverter().convertToEventModel(eventDefinitionCacheEntry.getEventDefinitionJson());\n    }\n}\n","sourceCodeStart":121,"sourceCodeEnd":151,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/cmd/GetEventModelCmd.java#L121-L151","documentation":"GetEventModelCmd.execute(), in the branch combining eventDefinitionKey + tenantId + parentDeploymentId, throws FlowableObjectNotFoundException when the latest event definition for that key cannot be found under that parent deployment for that tenant. It mirrors the non-tenant branch but additionally filters by tenant identifier.","triggerScenarios":"Calling the key+tenant+parent-deployment variant of the event model lookup when (a) the definition was never deployed for that tenant, (b) the parent deployment id does not match, or (c) the key is misspelled for that tenant's definitions.","commonSituations":"Multi-tenant setups where event definitions were deployed to tenant A but requested for tenant B; a deployment was made without the tenantId so the tenant-scoped query misses it; stale parent deployment id after redeployment.","solutions":["Verify the event definition exists for that tenantId (check tenant-scoped event definition tables).","Correct the parentDeploymentId to the deployment that actually contains the key for this tenant.","Redeploy the event definition with the correct tenantId if it is missing for that tenant.","Remove the tenant/parent-deployment restriction and look up by key alone if appropriate."],"exampleFix":"// before\neventRepositoryService.getEventModelByKeyAndParentDeploymentIdAndTenantId(\"orderCreated\", \"deploy-42\", \"tenant-acme\"); // not deployed for tenant-acme\n// after\neventRepositoryService.deploy(...withTenantId(\"tenant-acme\")...); // then retry lookup","handlingStrategy":"try-catch","validationCode":"EventDefinition d = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).eventDefinitionTenantId(tenantId).latestVersion().singleResult();\nif (d == null) throw new IllegalStateException(\"Event definition \" + key + \" not deployed for tenant \" + tenantId);","typeGuard":"boolean isDeployedForTenant(String key, String tenantId) {\n    return eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).eventDefinitionTenantId(tenantId).count() > 0;\n}","tryCatchPattern":"try {\n    EventModel model = eventRepositoryService.getEventModelByKeyAndParentDeploymentIdAndTenantId(key, parentDeploymentId, tenantId);\n} catch (FlowableObjectNotFoundException e) {\n    log.warn(\"Missing event definition key={} tenant={} deployment={}\", key, tenantId, parentDeploymentId, e);\n}","preventionTips":["Deploy event definitions with the tenantId set for multi-tenant environments.","Keep tenant and deployment ids together in one config source.","Query tenant-scoped definitions before lookup."],"tags":["flowable","event-registry","not-found","tenant","deployment"],"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"}