flowable/flowable-engine · error · FlowableObjectNotFoundException
no event definitions deployed with key '${eventDefinitionKey
Error message
no event definitions deployed with key '${eventDefinitionKey}' for deployment id '${deploymentId}' and tenant identifier '${tenantId}' What it means
Thrown by EventDeploymentManager when looking up the latest deployed event definition by key, deployment id, and tenant id, but the persistence layer returns no matching EventDefinitionEntity. The Flowable Event Registry throws FlowableObjectNotFoundException because the requested definition simply does not exist in the database for that exact (key, deploymentId, tenantId) combination. It is a lookup failure, not a corruption or internal bug.
Source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/deploy/EventDeploymentManager.java:152
return eventDefinition;
}
public EventDefinitionEntity findDeployedLatestEventDefinitionByKeyAndDeploymentId(String eventDefinitionKey, String deploymentId) {
EventDefinitionEntity eventDefinition = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKey(deploymentId, eventDefinitionKey);
if (eventDefinition == null) {
throw new FlowableObjectNotFoundException("no event definitions deployed with key '" + eventDefinitionKey +
"' for deployment id '" + deploymentId + "'");
}
eventDefinition = resolveEventDefinition(eventDefinition).getEventDefinitionEntity();
return eventDefinition;
}
public EventDefinitionEntity findDeployedLatestEventDefinitionByKeyDeploymentIdAndTenantId(String eventDefinitionKey, String deploymentId, String tenantId) {
EventDefinitionEntity eventDefinition = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKeyAndTenantId(deploymentId, eventDefinitionKey, tenantId);
if (eventDefinition == null) {
throw new FlowableObjectNotFoundException("no event definitions deployed with key '" + eventDefinitionKey +
"' for deployment id '" + deploymentId + "' and tenant identifier '" + tenantId + "'");
}
eventDefinition = resolveEventDefinition(eventDefinition).getEventDefinitionEntity();
return eventDefinition;
}
public EventDefinitionEntity findDeployedEventDefinitionByKeyAndVersionAndTenantId(String eventDefinitionKey, int eventVersion, String tenantId) {
EventDefinitionEntity eventDefinition = eventDefinitionEntityManager.findEventDefinitionByKeyAndVersionAndTenantId(eventDefinitionKey, eventVersion, tenantId);
if (eventDefinition == null) {
throw new FlowableObjectNotFoundException("no event definitions deployed with key = '" + eventDefinitionKey + "'");
}
eventDefinition = resolveEventDefinition(eventDefinition).getEventDefinitionEntity();
return eventDefinition;
}
/**View on GitHub (pinned to d6d39ce1c6)
Solutions
- Verify the deploymentId exists and contains the event key: query EventDeploymentQuery / EventDefinitionQuery with deploymentId(deploymentId).list() before the lookup.
- Check the tenantId matches the one used at deploy time (or pass empty/null for the default tenant).
- If the deployment is missing, redeploy the event model via EventRepositoryService.createDeployment().addClasspathResource(...).tenantId(...).deploy().
- Confirm the event definition key spelling against the JSON event model resource.
Example fix
// before
EventDefinitionEntity def = eventDeploymentManager
.findDeployedLatestEventDefinitionByKeyDeploymentIdAndTenantId(key, deploymentId, tenantId);
// after
EventDefinitionEntity def = managementService.getEventRepositoryService()
.createEventDefinitionQuery().deploymentId(deploymentId).tenantId(tenantId).listPage(0, 1)
.stream().findFirst()
.map(d -> eventDeploymentManager.findDeployedLatestEventDefinitionByKeyDeploymentIdAndTenantId(key, deploymentId, tenantId))
.orElse(null); Defensive patterns
Strategy: validation
Validate before calling
long count = eventRepositoryService.createEventDefinitionQuery()
.deploymentId(deploymentId).tenantId(tenantId).eventDefinitionKey(key).count();
if (count == 0) throw new IllegalStateException("event definition " + key + " not in deployment " + deploymentId + " for tenant " + tenantId); Try / catch
try {
def = manager.findDeployedLatestEventDefinitionByKeyDeploymentIdAndTenantId(key, deploymentId, tenantId);
} catch (FlowableObjectNotFoundException e) {
def = null; // handle missing definition explicitly
} Prevention
- Always confirm the deployment id and tenant with a deployment query before definition lookups.
- Use constant/class references for event keys instead of string literals.
- In multi-tenant apps, propagate tenantId consistently from a context holder.
- Add integration tests that assert key/deployment/tenant triples used at runtime.
When it happens
Trigger: Calling findDeployedLatestEventDefinitionByKeyDeploymentIdAndTenantId(eventDefinitionKey, deploymentId, tenantId) when no row in FLW_EV_DATABASE_DEFINITION matches all three values — e.g. wrong deploymentId, definition deployed under a different tenant, or the key never existed in that deployment.
Common situations: Copy-pasting a deployment id from another environment; multi-tenant setups where the definition was deployed to the default tenant but queried with a specific tenantId; querying after the deployment was deleted; typos in the event definition key.
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
- deployment does not exist:
- No event definition found for key '${eventDefinitionKey}' fo
- No event definition found for key '${eventDefinitionKey} for
- No deployment found for id = '${deploymentId}'
- Could not find deployment with id ${deploymentId}
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/992f3111f9bad6a2.
Report an issue: GitHub.