flowable/flowable-engine · error · FlowableEventJsonException
The channel json key detection value was not found for the c
Error message
The channel json key detection value was not found for the channel model with key ${key}. One of fixedValue, jsonField, jsonPointerExpression, delegateExpression should be set. What it means
Thrown when a 'json' inbound channel has a ChannelEventKeyDetection object but every detection mechanism (fixedValue, jsonField, jsonPointerExpression, delegateExpression) is empty. The detection element exists but does not specify any way to determine the event key.
Source
Thrown at modules/flowable-event-registry-json-converter/src/main/java/org/flowable/eventregistry/json/converter/InboundChannelModelValidator.java:52
if (StringUtils.isEmpty(inboundChannelModel.getPipelineDelegateExpression())) {
// Deserializer is only needed if there is no pipeline delegate expression
validateDeserializer(inboundChannelModel);
}
}
protected void validateDeserializer(InboundChannelModel inboundChannelModel) {
String deserializerType = inboundChannelModel.getDeserializerType();
ChannelEventKeyDetection channelEventKeyDetection = inboundChannelModel.getChannelEventKeyDetection();
if ("json".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.getJsonField()) &&
StringUtils.isEmpty(channelEventKeyDetection.getJsonPointerExpression()) &&
StringUtils.isEmpty(channelEventKeyDetection.getDelegateExpression())) {
throw new FlowableEventJsonException(
"The channel json key detection value was not found for the channel model with key " + inboundChannelModel.getKey()
+ ". 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)) {View on GitHub (pinned to d6d39ce1c6)
Solutions
- Set one of fixedValue, jsonField, jsonPointerExpression, or delegateExpression inside channelEventKeyDetection
- Use jsonField with the payload field name holding the event key (most common fix)
- Use jsonPointerExpression for nested keys, e.g. /header/eventType
- Use delegateExpression to reference a custom ChannelEventKeyDetection bean
Example fix
// before
"channelEventKeyDetection": {}
// after
"channelEventKeyDetection": {
"jsonField": "eventType"
} Defensive patterns
Strategy: validation
Validate before calling
ChannelEventKeyDetection d = channel.getChannelEventKeyDetection();
if ("json".equalsIgnoreCase(channel.getDeserializerType()) && d != null
&& isEmpty(d.getFixedValue()) && isEmpty(d.getJsonField())
&& isEmpty(d.getJsonPointerExpression()) && isEmpty(d.getDelegateExpression())) {
throw new IllegalArgumentException("channel '" + channel.getKey() + "' key detection has no value");
} Type guard
boolean hasDetectionValue = d -> d != null && (isSet(d.getFixedValue()) || isSet(d.getJsonField()) || isSet(d.getJsonPointerExpression()) || isSet(d.getDelegateExpression()));
Try / catch
try {
channelValidator.validateChannel(model);
} catch (FlowableEventJsonException e) {
logger.error("Key detection present but empty: {}", e.getMessage());
} Prevention
- Never commit channel definitions with an empty channelEventKeyDetection object
- Prefer jsonField for flat payloads; use jsonPointerExpression for nested ones
- Lint channel JSON files in CI for empty detection objects
When it happens
Trigger: validateDeserializer runs on a channel with deserializerType 'json' and channelEventKeyDetection present, but all four of getFixedValue(), getJsonField(), getJsonPointerExpression(), and getDelegateExpression() return empty/null strings.
Common situations: Copying a channel template with an empty channelEventKeyDetection object; serialization tooling emitting an empty key-detection block; hand-edits blanking out the detection values.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- The channel xml key detection value was not found for the ch
- 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 deserializer delegate expression was not set for
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/3a70bd88f6309754.
Report an issue: GitHub.