flowable/flowable-engine · error · FlowableObjectNotFoundException

No event definition found for key

Error message

No event definition found for key '${eventDefinitionKey}' for parent deployment id ${parentDeploymentId}

What it means

GetEventModelCmd.execute() looks up an EventDefinitionEntity by key (optionally scoped to a parent deployment id) and throws FlowableObjectNotFoundException when no definition exists. The event registry only serves event models for definitions that were deployed; a key that was never deployed, or not deployed under the given parent deployment, yields no row.

Solutions

  1. Verify the event definition key spelling against the deployed event definitions (check ACT_FO_EVENT_DEFINITION / event registry tables or RepositoryService-style queries).
  2. Query deployments to find the actual parent deployment id that contains this key and pass that id.
  3. Deploy the event definition (EventRegistryBuilder / event repository deploy) so the key exists before calling getEventModel.
  4. Drop the parentDeploymentId constraint (use key-only lookup) if the definition is deployed globally.
  5. If looking up by tenant, make sure the tenantId variant of the lookup is used instead.

Example fix

// before
eventRepositoryService.getEventModelByKeyAndParentDeploymentId("orderCreated", "deploy-42"); // deploy-42 has no such key
// after
// find the deployment that actually contains the key, then:
eventRepositoryService.getEventModelByKeyAndParentDeploymentId("orderCreated", correctDeploymentId);
Defensive patterns

Strategy: try-catch

Validate before calling

EventDefinition d = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).latestVersion().singleResult();
if (d == null) throw new IllegalStateException("Event definition key not deployed: " + key);

Type guard

boolean isDeployed(String key) {
    return eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).count() > 0;
}

Try / catch

try {
    EventModel model = eventRepositoryService.getEventModelByKeyAndParentDeploymentId(key, parentDeploymentId);
} catch (FlowableObjectNotFoundException e) {
    log.warn("Event definition {} not found under deployment {}", key, parentDeploymentId, e);
    // fall back to key-only lookup or redeploy
}

Prevention

When it happens

Trigger: Calling the EventRegistryEngine's getEventModel (via GetEventModelCmd) with an eventDefinitionKey plus parentDeploymentId where (a) the key was never deployed, (b) the key is deployed but under a different parent deployment id, or (c) the definition was deleted.

Common situations: Typos in event definition keys in application config; pointing at the wrong deployment id after a redeploy (parent deployment ids change per deployment); event definitions removed by a deployment cleanup/tenant purge; copying configuration between environments where deployments differ.

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/8d2d07e4271063cd. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/cmd/GetEventModelCmd.java:111

            if (eventDefinitionEntity == null) {
                throw new FlowableObjectNotFoundException("No event definition found for key '" + eventDefinitionKey + "' for tenant identifier '" + tenantId + "'", EventDefinitionEntity.class);
            }

        } else if (eventDefinitionKey != null && (tenantId == null || EventRegistryEngineConfiguration.NO_TENANT_ID.equals(tenantId)) && parentDeploymentId != null) {

            List<EventDeployment> eventDeployments = deploymentManager.getDeploymentEntityManager().findDeploymentsByQueryCriteria(
                            new EventDeploymentQueryImpl().parentDeploymentId(parentDeploymentId));
            
            if (eventDeployments != null && eventDeployments.size() > 0) {
                eventDefinitionEntity = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKey(eventDeployments.get(0).getId(), eventDefinitionKey);
            }
            
            if (eventDefinitionEntity == null) {
                eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKey(eventDefinitionKey);
            }
            
            if (eventDefinitionEntity == null) {
                throw new FlowableObjectNotFoundException("No event definition found for key '" + eventDefinitionKey +
                        "' for parent deployment id " + parentDeploymentId, EventDefinitionEntity.class);
            }

        } else if (eventDefinitionKey != null && tenantId != null && !EventRegistryEngineConfiguration.NO_TENANT_ID.equals(tenantId) && parentDeploymentId != null) {

            List<EventDeployment> eventDeployments = deploymentManager.getDeploymentEntityManager().findDeploymentsByQueryCriteria(
                            new EventDeploymentQueryImpl().parentDeploymentId(parentDeploymentId).deploymentTenantId(tenantId));
            
            if (eventDeployments != null && eventDeployments.size() > 0) {
                eventDefinitionEntity = eventDefinitionEntityManager.findEventDefinitionByDeploymentAndKeyAndTenantId(
                                eventDeployments.get(0).getId(), eventDefinitionKey, tenantId);
            }
            
            if (eventDefinitionEntity == null) {
                eventDefinitionEntity = eventDefinitionEntityManager.findLatestEventDefinitionByKeyAndTenantId(eventDefinitionKey, tenantId);
            }
            
            if (eventDefinitionEntity == null && eventEngineConfiguration.isFallbackToDefaultTenant()) {

View on GitHub (pinned to d6d39ce1c6)