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

  1. Verify the event definition exists for that tenantId (check tenant-scoped event definition tables).
  2. Correct the parentDeploymentId to the deployment that actually contains the key for this tenant.
  3. Redeploy the event definition with the correct tenantId if it is missing for that tenant.
  4. 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

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


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