flowable/flowable-engine · error · ActivitiIllegalArgumentException

value is null

Error message

value is null

What it means

ActivitiIllegalArgumentException thrown by AbstractVariableQueryImpl.variableValueEqualsIgnoreCase when the value argument is null. Ignore-case comparisons require a non-null String because the engine calls value.toLowerCase() immediately after the null check. The library validates eagerly at query-build time rather than failing later at query execution.

Solutions

  1. Check that the value is a non-null String before calling variableValueEqualsIgnoreCase; skip or branch the query when it is null.
  2. If a null means 'no filter', build the query conditionally instead of passing null.
  3. If null should match null variables, use variableValueEquals(name, null) instead, since null is only legal for EQUALS/NOT_EQUALS.

Example fix

// before
query.taskVariableValueEqualsIgnoreCase("status", statusFilter);
// after
if (statusFilter != null) {
    query.taskVariableValueEqualsIgnoreCase("status", statusFilter);
}
Defensive patterns

Strategy: validation

Validate before calling

if (name != null && value instanceof String && !((String) value).isEmpty()) {
    query.taskVariableValueEqualsIgnoreCase(name, (String) value);
}

Type guard

boolean isNonEmptyString(Object o) { return o instanceof String && !((String) o).isEmpty(); }

Try / catch

try {
    query.taskVariableValueEqualsIgnoreCase(name, value);
} catch (ActivitiIllegalArgumentException e) {
    log.warn("Skipping ignore-case filter: {}", e.getMessage());
    // rebuild query without the condition
}

Prevention

When it happens

Trigger: Calling taskService.createTaskQuery().taskVariableValueEqualsIgnoreCase(name, null) (or processInstance/candidate variants) with a null value; also the localScope overload variableValueEqualsIgnoreCase(name, null, true/false).

Common situations: The variable value comes from user input, an HTTP request parameter, an optional configuration field, or a database column that is NULL, and the code passes it straight into the ignore-case query builder.

Related errors


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

Appendix: source

Thrown at modules/flowable5-engine/src/main/java/org/activiti/engine/impl/AbstractVariableQueryImpl.java:81

    public T variableValueEquals(Object value) {
        return variableValueEquals(value, true);
    }

    @SuppressWarnings("unchecked")
    public T variableValueEquals(Object value, boolean localScope) {
        queryVariableValues.add(new QueryVariableValue(null, value, QueryOperator.EQUALS, localScope));
        return (T) this;
    }

    public T variableValueEqualsIgnoreCase(String name, String value) {
        return variableValueEqualsIgnoreCase(name, value, true);
    }

    @SuppressWarnings("unchecked")
    public T variableValueEqualsIgnoreCase(String name, String value, boolean localScope) {
        if (value == null) {
            throw new ActivitiIllegalArgumentException("value is null");
        }
        addVariable(name, value.toLowerCase(), QueryOperator.EQUALS_IGNORE_CASE, localScope);
        return (T) this;
    }

    public T variableValueNotEqualsIgnoreCase(String name, String value) {
        return variableValueNotEqualsIgnoreCase(name, value, true);
    }

    @SuppressWarnings("unchecked")
    public T variableValueNotEqualsIgnoreCase(String name, String value, boolean localScope) {
        if (value == null) {
            throw new ActivitiIllegalArgumentException("value is null");
        }
        addVariable(name, value.toLowerCase(), QueryOperator.NOT_EQUALS_IGNORE_CASE, localScope);
        return (T) this;
    }

View on GitHub (pinned to d6d39ce1c6)