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

  1. List available versions first with EventDefinitionQuery.eventDefinitionKey(key).list() and pick an existing eventVersion.
  2. Use findDeployedLatestEventDefinitionByKeyAndTenantId instead of pinning a version when the latest is acceptable.
  3. Verify tenantId matches the deployment's tenant (or use the default tenant).
  4. 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

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


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)