flowable/flowable-engine · error · FlowableObjectNotFoundException
No channel definition found for key '' for parent deployment
Error message
No channel definition found for key '' for parent deployment id
What it means
Thrown when resolving a channel definition by key within a given parentDeploymentId (no tenant) and neither the parent deployment nor any deployment contains a latest definition for that key. FlowableObjectNotFoundException naming key and parent deployment id.
Source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/cmd/GetChannelModelCmd.java:111
if (channelDefinitionEntity == null) {
throw new FlowableObjectNotFoundException("No channel definition found for key '" + channelDefinitionKey + "' for tenant identifier " + tenantId, ChannelDefinitionEntity.class);
}
} else if (channelDefinitionKey != 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) {
channelDefinitionEntity = channelDefinitionEntityManager.findChannelDefinitionByDeploymentAndKey(eventDeployments.get(0).getId(), channelDefinitionKey);
}
if (channelDefinitionEntity == null) {
channelDefinitionEntity = channelDefinitionEntityManager.findLatestChannelDefinitionByKey(channelDefinitionKey);
}
if (channelDefinitionEntity == null) {
throw new FlowableObjectNotFoundException("No channel definition found for key '" + channelDefinitionKey +
"' for parent deployment id " + parentDeploymentId, ChannelDefinitionEntity.class);
}
} else if (channelDefinitionKey != 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) {
channelDefinitionEntity = channelDefinitionEntityManager.findChannelDefinitionByDeploymentAndKeyAndTenantId(
eventDeployments.get(0).getId(), channelDefinitionKey, tenantId);
}
if (channelDefinitionEntity == null) {
channelDefinitionEntity = channelDefinitionEntityManager.findLatestChannelDefinitionByKeyAndTenantId(channelDefinitionKey, tenantId);
}
if (channelDefinitionEntity == null && eventEngineConfiguration.isFallbackToDefaultTenant()) {View on GitHub (pinned to d6d39ce1c6)
Solutions
- Verify the parent deployment actually contains a channel definition with that key (query its resources)
- Use the correct parentDeploymentId from the deployment that deployed the channel, or drop the parent filter
- Check the key spelling against the channel XML <channel id=...>
Example fix
// before
getChannelModel("orders", wrongParentDeploymentId, null);
// after
EventDeployment dep = repositoryService.createDeploymentQuery().deploymentName("orders-app").singleResult();
getChannelModel("orders", dep.getId(), null); Defensive patterns
Strategy: validation
Validate before calling
EventDeployment dep = repositoryService.createDeploymentQuery()
.deploymentId(parentDeploymentId).singleResult();
if (dep == null) throw new IllegalStateException("parent deployment " + parentDeploymentId + " does not exist"); Try / catch
try {
return repositoryService.getChannelModel(null, key, null, parentDeploymentId);
} catch (FlowableObjectNotFoundException e) {
LOGGER.error("channel {} not in parent deployment {}", key, parentDeploymentId);
throw e;
} Prevention
- Take parentDeploymentId from the deployment that actually deployed the channel
- Confirm the channel key exists inside the parent deployment's resources before lookup
When it happens
Trigger: getChannelModel with channelDefinitionKey + parentDeploymentId (tenantId null) where the parent deployment's channel definitions and the latest fallback both fail to match the key.
Common situations: Passing an event-deployment's parent id while the channel belongs to a different deployment; key mismatch within the parent deployment; parent deployment id itself stale/deleted.
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
- No channel definition found for id = ''
- No channel definition found for key '' for parent deployment
- Could not find a resource with id '<resourceName>' in deploy
- Could not find an app deployment with id '<deploymentId>
- no apps deployed with key = '' and version = ''
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/80fa48ba5e3bb2e4.
Report an issue: GitHub.