flowable/flowable-engine · error · FlowableObjectNotFoundException
No event definition found for key '${eventDefinitionKey} for
Error message
No event definition found for key '${eventDefinitionKey} for parent deployment id '${parentDeploymentId}' and for tenant identifier ${tenantId} What it means
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.
Source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/cmd/GetEventModelCmd.java:139
eventDefinitionEntity = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKeyAndTenantId(
eventDeployments.get(0).getId(), eventDefinitionKey, tenantId);
}
if (eventDefinitionEntity == null) {
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 parent deployment id '" + parentDeploymentId + "' and for tenant identifier " + tenantId, EventDefinitionEntity.class);
}
} else {
throw new FlowableObjectNotFoundException("eventDefinitionKey and eventDefinitionId are null");
}
EventDefinitionCacheEntry eventDefinitionCacheEntry = deploymentManager.resolveEventDefinition(eventDefinitionEntity);
return eventEngineConfiguration.getEventJsonConverter().convertToEventModel(eventDefinitionCacheEntry.getEventDefinitionJson());
}
}
View on GitHub (pinned to d6d39ce1c6)
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.
Example fix
// before
eventRepositoryService.getEventModelByKeyAndParentDeploymentIdAndTenantId("orderCreated", "deploy-42", "tenant-acme"); // not deployed for tenant-acme
// after
eventRepositoryService.deploy(...withTenantId("tenant-acme")...); // then retry lookup Defensive patterns
Strategy: try-catch
Validate before calling
EventDefinition d = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).eventDefinitionTenantId(tenantId).latestVersion().singleResult();
if (d == null) throw new IllegalStateException("Event definition " + key + " not deployed for tenant " + tenantId); Type guard
boolean isDeployedForTenant(String key, String tenantId) {
return eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).eventDefinitionTenantId(tenantId).count() > 0;
} Try / catch
try {
EventModel model = eventRepositoryService.getEventModelByKeyAndParentDeploymentIdAndTenantId(key, parentDeploymentId, tenantId);
} catch (FlowableObjectNotFoundException e) {
log.warn("Missing event definition key={} tenant={} deployment={}", key, tenantId, parentDeploymentId, e);
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- Could not find deployment with id <deploymentId>
- No event definition found for event key ${sendEventServiceTa
- Could not find deployment with id
- No channel definition found for key '' for parent deployment
- deployment does not exist:
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/e52339db7593a6f1.
Report an issue: GitHub.