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
- Check that the value is a non-null String before calling variableValueEqualsIgnoreCase; skip or branch the query when it is null.
- If a null means 'no filter', build the query conditionally instead of passing null.
- 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
- Null-check optional filter values before building variable queries
- Remember null variable matches require variableValueEquals(name, null), not the ignore-case variant
- Centralize query-building in a helper that sanitizes inputs once
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)