flowable/flowable-engine · error · FlowableIllegalArgumentException

configurations are null

Error message

configurations are null

What it means

EventSubscriptionQueryImpl.configurations() requires a non-null Collection of configuration values for an IN-style filter. Flowable throws FlowableIllegalArgumentException when the collection is null; empty is permitted, null is not, because the query builder cannot translate null into a predicate.

Solutions

  1. Default the collection to Collections.emptyList() before the call, or skip the configurations() call
  2. Coerce null lists to empty at deserialization time (e.g. initialize field to a new ArrayList)
  3. Validate the input list at the API boundary before building the query

Example fix

// before
query.configurations(signalNames);

// after
query.configurations(signalNames == null ? Collections.emptyList() : signalNames);
Defensive patterns

Strategy: validation

Validate before calling

if (configurations == null) {
    configurations = Collections.emptyList();
}

Type guard

boolean validConfigurations(Collection<String> c) { return c != null && c.stream().allMatch(Objects::nonNull); }

Try / catch

try {
    query.configurations(configurations);
} catch (FlowableIllegalArgumentException e) {
    log.warn("configurations null", e);
}

Prevention

When it happens

Trigger: Calling eventSubscriptionQuery.configurations(null), e.g. passing a nullable list of message/signal names loaded from config or deserialized from a request with the field omitted.

Common situations: Batch lookups of subscriptions for multiple signal names where the name list is assembled dynamically and can be absent; JSON body field missing mapped to null.

Related errors


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

Appendix: source

Thrown at modules/flowable-eventsubscription-service/src/main/java/org/flowable/eventsubscription/service/impl/EventSubscriptionQueryImpl.java:449

    @Override
    public EventSubscriptionQueryImpl configuration(String configuration) {
        if (configuration == null) {
            throw new FlowableIllegalArgumentException("configuration is null");
        }

        if (inOrStatement) {
            this.currentOrQueryObject.configuration = configuration;
        } else {
            this.configuration = configuration;
        }

        return this;
    }

    @Override
    public EventSubscriptionQueryImpl configurations(Collection<String> configurations) {
        if (configurations == null) {
            throw new FlowableIllegalArgumentException("configurations are null");
        }

        if (inOrStatement) {
            this.currentOrQueryObject.configurations = configurations;
        } else {
            this.configurations = configurations;
        }

        return this;
    }

    @Override
    public EventSubscriptionQueryImpl withoutConfiguration() {
        if (inOrStatement) {
            this.currentOrQueryObject.withoutConfiguration = true;
        } else {
            this.withoutConfiguration = true;
        }

View on GitHub (pinned to d6d39ce1c6)