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

  1. Set deserializerDelegateExpression in the channel model, e.g. "${myDeserializerBean}"
  2. Ensure the referenced bean exists in the application context and implements the deserializer delegate interface
  3. 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

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


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