flowable/flowable-engine · error · FlowableIllegalArgumentException

Provided exception message is null

Error message

Provided exception message is null

What it means

ExternalWorkerJobQueryImpl.exceptionMessage(String) rejects a null exception message because a null filter value would yield an invalid equality predicate on the EXCEPTION_MSG_ column. Flowable validates required query arguments eagerly and throws FlowableIllegalArgumentException. Note it filters by exact message, not substring.

Solutions

  1. Only call exceptionMessage(msg) when msg != null, otherwise skip the filter
  2. If searching failed jobs, combine jobWithException() with a non-null message
  3. Branch on message presence instead of passing the null value through
  4. Normalize/escape the message if matching recorded exception messages

Example fix

// before
query.jobWithException().exceptionMessage(failedJob.getExceptionMessage());
// after
query.jobWithException();
if (failedJob.getExceptionMessage() != null) {
    query.exceptionMessage(failedJob.getExceptionMessage());
}
Defensive patterns

Strategy: validation

Validate before calling

if (exceptionMessage != null) {
    externalWorkerJobQuery.jobWithException().exceptionMessage(exceptionMessage);
}

Type guard

boolean hasMessage(String m) { return m != null && !m.isEmpty(); }

Prevention

When it happens

Trigger: Calling exceptionMessage(null), e.g. when copying an exception message from a Job entity whose getExceptionMessage() returned null, or a search input that was never set.

Common situations: Admin consoles searching failed jobs by error text; retry tooling filtering on a job's stored exception message when no exception was recorded.

Related errors


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

Appendix: source

Thrown at modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/ExternalWorkerJobQueryImpl.java:456

            this.duedateLowerThan = date;
        }
        return this;
    }

    @Override
    public ExternalWorkerJobQuery withException() {
        if (inOrStatement) {
            this.currentOrQueryObject.withException = true;
        } else {
            this.withException = true;
        }
        return this;
    }

    @Override
    public ExternalWorkerJobQuery exceptionMessage(String exceptionMessage) {
        if (exceptionMessage == null) {
            throw new FlowableIllegalArgumentException("Provided exception message is null");
        }
        if (inOrStatement) {
            this.currentOrQueryObject.exceptionMessage = exceptionMessage;
        } else {
            this.exceptionMessage = exceptionMessage;
        }
        return this;
    }

    @Override
    public ExternalWorkerJobQuery jobTenantId(String tenantId) {
        if (tenantId == null) {
            throw new FlowableIllegalArgumentException("Provided tenant id is null");
        }
        if (inOrStatement) {
            this.currentOrQueryObject.tenantId = tenantId;
        } else {
            this.tenantId = tenantId;

View on GitHub (pinned to d6d39ce1c6)