flowable/flowable-engine · error · FlowableEventJsonException
The channel deserializer delegate expression was not set for
Error message
The channel deserializer delegate expression was not set for the channel model with key ${channelModel} What it means
Thrown when an inbound channel declares deserializerType 'expression' but no deserializerDelegateExpression is set. The 'expression' deserializer delegates payload deserialization to a custom bean, so its delegate expression is mandatory.
Source
Thrown at modules/flowable-event-registry-json-converter/src/main/java/org/flowable/eventregistry/json/converter/InboundChannelModelValidator.java:72
+ ". One of fixedValue, jsonField, jsonPointerExpression, delegateExpression should be set.");
}
} else if ("xml".equalsIgnoreCase(deserializerType)) {
if (channelEventKeyDetection == null) {
throw new FlowableEventJsonException("A channel key detection value is required for the channel model with key " + inboundChannelModel.getKey());
}
if (StringUtils.isEmpty(channelEventKeyDetection.getFixedValue()) &&
StringUtils.isEmpty(channelEventKeyDetection.getXmlXPathExpression()) &&
StringUtils.isEmpty(channelEventKeyDetection.getDelegateExpression())) {
throw new FlowableEventJsonException(
"The channel xml key detection value was not found for the channel model with key " + inboundChannelModel.getKey()
+ ". One of fixedValue, xmlPathExpression, delegateExpression should be set.");
}
} else if ("expression".equalsIgnoreCase(deserializerType)) {
if (StringUtils.isEmpty(inboundChannelModel.getDeserializerDelegateExpression())) {
throw new FlowableEventJsonException(
"The channel deserializer delegate expression was not set for the channel model with key " + inboundChannelModel);
}
} else if (deserializerType != null) {
throw new FlowableEventJsonException(
"The deserializer type is not supported " + deserializerType + " for the channel model with key " + inboundChannelModel.getKey());
}
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Set deserializerDelegateExpression in the channel model, e.g. "${myDeserializerBean}"
- Ensure the referenced bean exists in the application context and implements the deserializer delegate interface
- Alternatively switch deserializerType to 'json' or 'xml' if built-in deserialization suffices
Example fix
// before
{
"key": "customChannel",
"deserializerType": "expression"
}
// after
{
"key": "customChannel",
"deserializerType": "expression",
"deserializerDelegateExpression": "${myPayloadDeserializer}"
} Defensive patterns
Strategy: validation
Validate before calling
if ("expression".equalsIgnoreCase(channel.getDeserializerType()) && (channel.getDeserializerDelegateExpression() == null || channel.getDeserializerDelegateExpression().isEmpty())) {
throw new IllegalArgumentException("channel '" + channel.getKey() + "' with expression deserializer needs deserializerDelegateExpression");
} Type guard
boolean hasDeserializerDelegate = c -> !"expression".equalsIgnoreCase(c.getDeserializerType()) || isSet(c.getDeserializerDelegateExpression());
Try / catch
try {
convertChannel(channelJson);
} catch (FlowableEventJsonException e) {
logger.error("Deserializer delegate expression missing: {}", e.getMessage());
} Prevention
- Whenever deserializerType is expression, immediately add deserializerDelegateExpression
- Confirm the referenced bean name exists in the Spring context
- Add a startup-time validation test for all channel definitions
When it happens
Trigger: validateDeserializer runs on a channel with deserializerType 'expression' and StringUtils.isEmpty(inboundChannelModel.getDeserializerDelegateExpression()) is true.
Common situations: Choosing the 'expression' deserializer type in the channel JSON and forgetting deserializerDelegateExpression; renaming the Spring bean without updating the expression.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- EventRegistryEventDefinition on '" + elementId + "' has an e
- There is no correlation parameter with name '{correlationPar
- A channel key detection value is required for the channel mo
- The channel json key detection value was not found for the c
- The channel xml key detection value was not found for the ch
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/be350e74deebf366.
Report an issue: GitHub.