flowable/flowable-engine · error · FlowableObjectNotFoundException

No event definition found for key ''

Error message

No event definition found for key ''

What it means

When resolving by eventDefinitionKey with no tenant (or NO_TENANT_ID) and default version lookup, findDeployedLatestEventDefinitionByKey returned null, so the command throws FlowableObjectNotFoundException 'No event definition found for key <key>'. The key has no deployed latest definition in the default tenant scope.

Source

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

        EventRegistryEngineConfiguration eventEngineConfiguration = CommandContextUtil.getEventRegistryConfiguration(commandContext);
        EventDeploymentManager deploymentManager = eventEngineConfiguration.getDeploymentManager();
        EventDefinitionEntityManager eventDefinitionEntityManager = eventEngineConfiguration.getEventDefinitionEntityManager();

        // Find the event definition
        EventDefinitionEntity eventDefinitionEntity = null;
        if (eventDefinitionId != null) {

            eventDefinitionEntity = deploymentManager.findDeployedEventDefinitionById(eventDefinitionId);
            if (eventDefinitionEntity == null) {
                throw new FlowableObjectNotFoundException("No event definition found for id = '" + eventDefinitionId + "'", EventDefinitionEntity.class);
            }

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

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

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

            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 tenant identifier '" + tenantId + "'", EventDefinitionEntity.class);

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Verify the key with EventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).latestVersion().singleResult()
  2. Deploy the event model containing that key before calling getEventModelByKey
  3. Correct the key string to match the deployed definition

Example fix

// before
EventModel m = eventRepositoryService.getEventModelByKey("orderCreated"); // key never deployed
// after
EventDefinition d = eventRepositoryService.createEventDefinitionQuery()
    .eventDefinitionKey("orderCreated").latestVersion().singleResult();
if (d == null) {
    eventRepositoryService.createDeployment().addClasspathResource("order-created.event.json").deploy();
}
EventModel m = eventRepositoryService.getEventModelByKey("orderCreated");
Defensive patterns

Strategy: validation

Validate before calling

EventDefinition def = eventRepositoryService.createEventDefinitionQuery()
    .eventDefinitionKey(key).latestVersion().singleResult();
if (def == null) throw new IllegalArgumentException("No event definition for key: " + key);

Type guard

boolean keyDeployed = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key).count() > 0;

Try / catch

try {
    return eventRepositoryService.getEventModelByKey(key);
} catch (FlowableObjectNotFoundException e) {
    log.warn("No event definition for key {}; ensure deployment ran", key);
    throw e;
}

Prevention

When it happens

Trigger: GetEventModelCmd(eventDefinitionId=null, eventDefinitionKey='someKey', tenantId=null) where no event definition with that key was ever deployed, or all its deployments were deleted.

Common situations: Typo in the event key (key in code vs key in the deployed JSON model); event model never deployed; key renamed in the model source after deployments were cleaned up.

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


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