flowable/flowable-engine · error · FlowableEventJsonException

Not supported channel model type was found

Error message

Not supported ${channelType} channel model type was found ${type}

What it means

ChannelJsonConverter.determineChannelModelClass resolves the concrete ChannelModel subclass from the JSON's 'channelType' and 'type' fields via a lookup map keyed 'channelType-type'. When the combination is not registered it throws FlowableEventJsonException('Not supported ${channelType} channel model type was found ${type}').

Solutions

  1. Check the JSON's 'channelType' and 'type' values; correct typos to a supported combination (e.g. jms-inbound, kafka-outbound, http-outbound).
  2. Upgrade Flowable-event-registry modules so the converter knows the channel type used in the JSON.
  3. For custom types, extend the converter and register the new channel class in channelModelClasses.

Example fix

// before
{"channelType":"jms","type":"inbound"} // typo: type is nested field 'type: "inbound"'
// after
{"channelType":"jms","type":"inbound", ...} with recognized pair, e.g.
{"key":"myChannel","channelType":"jms","type":"inbound"} — verify against supported jms-inbound mapping
Defensive patterns

Strategy: validation

Validate before calling

Set<String> supported = Set.of("jms-inbound","jms-outbound","kafka-inbound","kafka-outbound","http-inbound","http-outbound","rabbitmq-inbound","rabbitmq-outbound");
String combo = channelType + "-" + type;
if (!supported.contains(combo)) {
    throw new IllegalArgumentException("Unsupported channel type: " + combo);
}

Type guard

boolean isSupportedChannelType(String channelType, String type) {
    return channelType != null && type != null && !channelType.isEmpty() && !type.isEmpty();
}

Try / catch

try {
    ChannelModel model = converter.convertToChannelModel(json);
} catch (FlowableEventJsonException e) {
    if (e.getMessage() != null && e.getMessage().startsWith("Not supported")) {
        LOG.error("Check channelType/type fields in JSON: {}", e.getMessage());
    }
    throw e;
}

Prevention

When it happens

Trigger: Converting channel JSON whose channelType/type pair has no entry in channelModelClasses — e.g. unknown channelType like 'jms'/'kafka' not registered, or a misspelled/renamed type field.

Common situations: Deploying a custom or newer channel model JSON into an engine version that lacks the converter mapping, typos in the JSON 'type' field, or writing a custom channel type without registering its model class in a custom converter.

Related errors


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

Appendix: source

Thrown at modules/flowable-event-registry-json-converter/src/main/java/org/flowable/eventregistry/json/converter/ChannelJsonConverter.java:112

            return channelModel;
        } catch (FlowableEventJsonException e) {
            throw e;
        } catch (Exception e) {
            throw new FlowableEventJsonException("Error reading channel json", e);
        }
    }

    protected Class<? extends ChannelModel> determineChannelModelClass(JsonNode channelNode) {
        String channelType = channelNode.path("channelType").stringValue(null);
        String type = channelNode.path("type").stringValue(null);

        Class<? extends ChannelModel> channelClass = channelModelClasses.get(channelType + "-" + type);
        if (channelClass != null) {
            return channelClass;
        }

        throw new FlowableEventJsonException("Not supported " + channelType + " channel model type was found " + type);
    }

    protected void validateChannel(ChannelModel channelModel) {
        for (ChannelValidator validator : validators) {
            validator.validateChannel(channelModel);
        }
    }

    public String convertToJson(ChannelModel definition) {
        try {
            return objectMapperSupplier.get().writeValueAsString(definition);
        } catch (Exception e) {
            throw new FlowableEventJsonException("Error writing channel json", e);
        }
    }

    public List<ChannelValidator> getValidators() {
        return validators;

View on GitHub (pinned to d6d39ce1c6)