{"record":{"id":"1f6dee849b5684b7","repo":"flowable/flowable-engine","slug":"implementation-is-null","errorCode":null,"errorMessage":"implementation is null","messagePattern":"implementation is null","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/ChannelDefinitionQueryImpl.java","lineNumber":267,"sourceCode":"            throw new FlowableIllegalArgumentException(\"Cannot combine onlyInbound() with onlyOutbound() in the same query\");\n        }\n        this.onlyInbound = true;\n        return this;\n    }\n\n    @Override\n    public ChannelDefinitionQuery onlyOutbound() {\n        if (onlyInbound) {\n            throw new FlowableIllegalArgumentException(\"Cannot combine onlyOutbound() with onlyInbound() in the same query\");\n        }\n        this.onlyOutbound = true;\n        return this;\n    }\n\n    @Override\n    public ChannelDefinitionQuery implementation(String implementation) {\n        if (implementation == null) {\n            throw new FlowableIllegalArgumentException(\"implementation is null\");\n        }\n        this.implementation = implementation;\n        return this;\n    }\n\n    @Override\n    public ChannelDefinitionQueryImpl channelCreateTime(Date createTime) {\n        this.createTime = createTime;\n        return this;\n    }\n    \n    @Override\n    public ChannelDefinitionQueryImpl channelCreateTimeAfter(Date createTimeAfter) {\n        this.createTimeAfter = createTimeAfter;\n        return this;\n    }\n    \n    @Override","sourceCodeStart":249,"sourceCodeEnd":285,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/ChannelDefinitionQueryImpl.java#L249-L285","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nquery.implementation(channelModel.getImplementation()); // may be null\n// after\nif (channelModel.getImplementation() != null) {\n    query.implementation(channelModel.getImplementation());\n}","handlingStrategy":"validation","validationCode":"if (implementation == null || implementation.isBlank()) {\n    throw new IllegalArgumentException(\"implementation filter requires a non-null value\");\n}\nquery.implementation(implementation);","typeGuard":"boolean hasImplementation(String impl) {\n    return impl != null && !impl.isBlank();\n}","tryCatchPattern":"try {\n    query.implementation(impl);\n} catch (FlowableIllegalArgumentException e) {\n    logger.warn(\"Invalid implementation filter: {}\", e.getMessage());\n}","preventionTips":["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"],"tags":["flowable","null-argument","query-builder","validation"],"backgroundTag":"null-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}