flowable/flowable-engine · error · FlowableIllegalArgumentException

keyLike is null

Error message

keyLike is null

What it means

ChannelDefinitionQueryImpl.channelDefinitionKeyLike() throws FlowableIllegalArgumentException when the keyLike pattern is null. Like-clause filters need a SQL LIKE pattern string; null is rejected eagerly by the builder so a malformed query is never constructed.

Solutions

  1. Pass a non-null LIKE pattern, e.g. channelDefinitionKeyLike("prefix%")
  2. Use an empty-guard: default the pattern to a sensible value like "%" only when a wildcard search is truly intended
  3. Only call channelDefinitionKeyLike when the pattern is non-null; omit the filter otherwise
  4. For exact matching use channelDefinitionKey(key) instead

Example fix

// before
String pattern = getPatternFromConfig(); // may be null
query.channelDefinitionKeyLike(pattern);
// after
if (pattern != null) {
    query.channelDefinitionKeyLike(pattern);
}
Defensive patterns

Strategy: validation

Validate before calling

if (keyLike == null) {
    throw new IllegalArgumentException("keyLike pattern is required");
}
query.channelDefinitionKeyLike(keyLike);

Type guard

boolean hasLikePattern(String pattern) {
    return pattern != null && !pattern.isBlank();
}

Try / catch

try {
    query.channelDefinitionKeyLike(pattern);
} catch (FlowableIllegalArgumentException e) {
    logger.warn("Invalid keyLike pattern: {}", e.getMessage());
}

Prevention

When it happens

Trigger: Calling channelDefinitionQuery().channelDefinitionKeyLike(null), e.g. a pattern variable built from user input or config that is null.

Common situations: Building dynamic searches where the pattern expression (e.g. "myChannel%") was never assigned; passing an optional CLI/config value straight through without a default.

Related errors


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

Appendix: source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/ChannelDefinitionQueryImpl.java:182

            throw new FlowableIllegalArgumentException("parentDeploymentId is null");
        }
        this.parentDeploymentId = parentDeploymentId;
        return this;
    }

    @Override
    public ChannelDefinitionQueryImpl channelDefinitionKey(String key) {
        if (key == null) {
            throw new FlowableIllegalArgumentException("key is null");
        }
        this.key = key;
        return this;
    }

    @Override
    public ChannelDefinitionQueryImpl channelDefinitionKeyLike(String keyLike) {
        if (keyLike == null) {
            throw new FlowableIllegalArgumentException("keyLike is null");
        }
        this.keyLike = keyLike;
        return this;
    }
    
    @Override
    public ChannelDefinitionQuery channelDefinitionKeyLikeIgnoreCase(String keyLikeIgnoreCase) {
        if (keyLikeIgnoreCase == null) {
            throw new FlowableIllegalArgumentException("keyLikeIgnoreCase is null");
        }
        this.keyLikeIgnoreCase = keyLikeIgnoreCase;
        return this;
    }

    @Override
    public ChannelDefinitionQueryImpl channelVersion(Integer version) {
        checkVersion(version);
        this.version = version;

View on GitHub (pinned to d6d39ce1c6)