flowable/flowable-engine · error · FlowableIllegalArgumentException
implementation is null
Error message
implementation is null
What it means
ChannelDefinitionQueryImpl.implementation() throws FlowableIllegalArgumentException when the implementation string is null. The implementation filter (e.g. the channel implementation type such as 'jms', 'kafka', 'rabbitmq') must be a concrete value; null is rejected at build time so the resulting SQL filter is always well-formed.
Solutions
- Pass the concrete implementation type string matching your channel model (e.g. "jms", "kafka")
- Guard the call: only invoke implementation(type) when type != null
- Omit the filter entirely when you do not want to constrain by implementation
- Verify the config/model source actually defines the implementation property
Example fix
// before
query.implementation(channelModel.getImplementation()); // may be null
// after
if (channelModel.getImplementation() != null) {
query.implementation(channelModel.getImplementation());
} Defensive patterns
Strategy: validation
Validate before calling
if (implementation == null || implementation.isBlank()) {
throw new IllegalArgumentException("implementation filter requires a non-null value");
}
query.implementation(implementation); Type guard
boolean hasImplementation(String impl) {
return impl != null && !impl.isBlank();
} Try / catch
try {
query.implementation(impl);
} catch (FlowableIllegalArgumentException e) {
logger.warn("Invalid implementation filter: {}", e.getMessage());
} Prevention
- Ensure channel models/config always define the implementation type before filtering on it
- Use a constant/enum for known implementation types (e.g. "jms", "kafka", "rabbitmq")
- Omit the filter when implementation is not constrained
- Fail fast during config loading so null implementations never reach query builders
When it happens
Trigger: Calling channelDefinitionQuery().implementation(null), usually because the implementation type came from an unset config property, a nullable enum-to-string conversion, or a model object missing the field.
Common situations: Filtering by channel implementation type where the type was never configured; passing ChannelModel.getImplementation() when the model omits it; migration code where new implementation metadata was not backfilled.
Related errors
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/1f6dee849b5684b7.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/ChannelDefinitionQueryImpl.java:267
throw new FlowableIllegalArgumentException("Cannot combine onlyInbound() with onlyOutbound() in the same query");
}
this.onlyInbound = true;
return this;
}
@Override
public ChannelDefinitionQuery onlyOutbound() {
if (onlyInbound) {
throw new FlowableIllegalArgumentException("Cannot combine onlyOutbound() with onlyInbound() in the same query");
}
this.onlyOutbound = true;
return this;
}
@Override
public ChannelDefinitionQuery implementation(String implementation) {
if (implementation == null) {
throw new FlowableIllegalArgumentException("implementation is null");
}
this.implementation = implementation;
return this;
}
@Override
public ChannelDefinitionQueryImpl channelCreateTime(Date createTime) {
this.createTime = createTime;
return this;
}
@Override
public ChannelDefinitionQueryImpl channelCreateTimeAfter(Date createTimeAfter) {
this.createTimeAfter = createTimeAfter;
return this;
}
@OverrideView on GitHub (pinned to d6d39ce1c6)