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

  1. Pass the concrete implementation type string matching your channel model (e.g. "jms", "kafka")
  2. Guard the call: only invoke implementation(type) when type != null
  3. Omit the filter entirely when you do not want to constrain by implementation
  4. 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

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;
    }
    
    @Override

View on GitHub (pinned to d6d39ce1c6)