flowable/flowable-engine · error · FlowableObjectNotFoundException
no event definitions deployed with key =
Error message
no event definitions deployed with key = '${eventDefinitionKey}' What it means
Thrown by EventDeploymentManager when finding an event definition by key, version, and tenant id yields no persisted entity. Flowable signals this as FlowableObjectNotFoundException so callers know that specific key/version/tenant combination has never been deployed. The message only mentions the key, but the lookup also involved version and tenant.
Solutions
- List available versions first with EventDefinitionQuery.eventDefinitionKey(key).list() and pick an existing eventVersion.
- Use findDeployedLatestEventDefinitionByKeyAndTenantId instead of pinning a version when the latest is acceptable.
- Verify tenantId matches the deployment's tenant (or use the default tenant).
- Deploy the missing event model version if it is genuinely absent.
Example fix
// before
EventDefinitionEntity def = eventDeploymentManager
.findDeployedEventDefinitionByKeyAndVersionAndTenantId("orderEvent", 1, "acme");
// after
EventDefinition def = eventRepositoryService.createEventDefinitionQuery()
.eventDefinitionKey("orderEvent").latestVersion().tenantId("acme").singleResult(); Defensive patterns
Strategy: validation
Validate before calling
EventDefinition def = eventRepositoryService.createEventDefinitionQuery()
.eventDefinitionKey(key).eventDefinitionVersion(version).tenantId(tenantId).singleResult();
if (def == null) throw new IllegalStateException("no event definition " + key + " v" + version + " for tenant " + tenantId); Try / catch
try {
def = manager.findDeployedEventDefinitionByKeyAndVersionAndTenantId(key, version, tenantId);
} catch (FlowableObjectNotFoundException e) {
def = manager.findDeployedLatestEventDefinitionByKeyAndTenantId(key, tenantId); // fallback to latest
} Prevention
- Prefer latest-version lookups over hardcoding version numbers.
- List deployed versions for a key before pinning one.
- Keep version pins in configuration that is updated together with deployments.
- Verify tenantId conventions (empty string vs null) match your deployment code.
When it happens
Trigger: Calling findDeployedEventDefinitionByKeyAndVersionAndTenantId(eventDefinitionKey, eventVersion, tenantId) when no EventDefinitionEntity matches the key, version and tenantId — typically a version number that was never deployed or an invalid tenantId.
Common situations: Hardcoded version numbers after a redeploy bumped the version; pinning version 1 while only version 2 exists; tenant mismatch; asking for a definition before deployment completed.
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
- Could not find a deployment with id
- Could not find deployment with id
- Could not find deployment with id
- Could not find event model with key
- deployment does not exist:
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/abf060caedd5b8df.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/deploy/EventDeploymentManager.java:163
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;
}
/**
* Resolving the event will fetch the event definition, parse it and store the {@link EventDefinition} in memory.
*/
public EventDefinitionCacheEntry resolveEventDefinition(EventDefinition eventDefinition) {
String eventDefinitionId = eventDefinition.getId();
String deploymentId = eventDefinition.getDeploymentId();
EventDefinitionCacheEntry cachedEventDefinition = eventDefinitionCache.get(eventDefinitionId);
if (cachedEventDefinition == null) {
EventDeploymentEntity deployment = engineConfig.getDeploymentEntityManager().findById(deploymentId);
List<EventResourceEntity> resources = engineConfig.getResourceEntityManager().findResourcesByDeploymentId(deploymentId);View on GitHub (pinned to d6d39ce1c6)