flowable/flowable-engine · error · FlowableObjectNotFoundException
No event definition found for key ''
Error message
No event definition found for key ''
What it means
When resolving by eventDefinitionKey with no tenant (or NO_TENANT_ID) and default version lookup, findDeployedLatestEventDefinitionByKey returned null, so the command throws FlowableObjectNotFoundException 'No event definition found for key <key>'. The key has no deployed latest definition in the default tenant scope.
Source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/cmd/GetEventModelCmd.java:76
EventRegistryEngineConfiguration eventEngineConfiguration = CommandContextUtil.getEventRegistryConfiguration(commandContext);
EventDeploymentManager deploymentManager = eventEngineConfiguration.getDeploymentManager();
EventDefinitionEntityManager eventDefinitionEntityManager = eventEngineConfiguration.getEventDefinitionEntityManager();
// Find the event definition
EventDefinitionEntity eventDefinitionEntity = null;
if (eventDefinitionId != null) {
eventDefinitionEntity = deploymentManager.findDeployedEventDefinitionById(eventDefinitionId);
if (eventDefinitionEntity == null) {
throw new FlowableObjectNotFoundException("No event definition found for id = '" + eventDefinitionId + "'", EventDefinitionEntity.class);
}
} else if (eventDefinitionKey != null && (tenantId == null || EventRegistryEngineConfiguration.NO_TENANT_ID.equals(tenantId)) &&
(parentDeploymentId == null || eventEngineConfiguration.isAlwaysLookupLatestDefinitionVersion())) {
eventDefinitionEntity = deploymentManager.findDeployedLatestEventDefinitionByKey(eventDefinitionKey);
if (eventDefinitionEntity == null) {
throw new FlowableObjectNotFoundException("No event definition found for key '" + eventDefinitionKey + "'", EventDefinitionEntity.class);
}
} else if (eventDefinitionKey != null && tenantId != null && !EventRegistryEngineConfiguration.NO_TENANT_ID.equals(tenantId) &&
(parentDeploymentId == null || eventEngineConfiguration.isAlwaysLookupLatestDefinitionVersion())) {
eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKeyAndTenantId(eventDefinitionKey, tenantId);
if (eventDefinitionEntity == null && eventEngineConfiguration.isFallbackToDefaultTenant()) {
String defaultTenant = eventEngineConfiguration.getDefaultTenantProvider().getDefaultTenant(tenantId, ScopeTypes.EVENT_REGISTRY, eventDefinitionKey);
if (StringUtils.isNotEmpty(defaultTenant)) {
eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKeyAndTenantId(eventDefinitionKey, defaultTenant);
} else {
eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKey(eventDefinitionKey);
}
}
if (eventDefinitionEntity == null) {
throw new FlowableObjectNotFoundException("No event definition found for key '" + eventDefinitionKey + "' for tenant identifier '" + tenantId + "'", EventDefinitionEntity.class);View on GitHub (pinned to d6d39ce1c6)
Solutions
- Verify the key with EventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).latestVersion().singleResult()
- Deploy the event model containing that key before calling getEventModelByKey
- Correct the key string to match the deployed definition
Example fix
// before
EventModel m = eventRepositoryService.getEventModelByKey("orderCreated"); // key never deployed
// after
EventDefinition d = eventRepositoryService.createEventDefinitionQuery()
.eventDefinitionKey("orderCreated").latestVersion().singleResult();
if (d == null) {
eventRepositoryService.createDeployment().addClasspathResource("order-created.event.json").deploy();
}
EventModel m = eventRepositoryService.getEventModelByKey("orderCreated"); Defensive patterns
Strategy: validation
Validate before calling
EventDefinition def = eventRepositoryService.createEventDefinitionQuery()
.eventDefinitionKey(key).latestVersion().singleResult();
if (def == null) throw new IllegalArgumentException("No event definition for key: " + key); Type guard
boolean keyDeployed = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).count() > 0;
Try / catch
try {
return eventRepositoryService.getEventModelByKey(key);
} catch (FlowableObjectNotFoundException e) {
log.warn("No event definition for key {}; ensure deployment ran", key);
throw e;
} Prevention
- Keep event keys in shared constants matching deployed models
- Auto-deploy event models at startup
- Grep deployed resources for the key before runtime lookups
When it happens
Trigger: GetEventModelCmd(eventDefinitionId=null, eventDefinitionKey='someKey', tenantId=null) where no event definition with that key was ever deployed, or all its deployments were deleted.
Common situations: Typo in the event key (key in code vs key in the deployed JSON model); event model never deployed; key renamed in the model source after deployments were cleaned up.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- No event definition found for id = ''
- No event definition found for key '${eventDefinitionKey}' fo
- No event definition found for id = '${eventDefinitionId}'
- Could not find event model with key '{eventDefinitionKey}'.
- deployment does not exist:
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/ce0848b9755ffe68.
Report an issue: GitHub.