flowable/flowable-engine · error · FlowableIllegalArgumentException
Operator ${operator} is not supported for the variable value
Error message
Operator ${operator} is not supported for the variable value What it means
After mapping the operator string to QueryOperator, populateQueryVariableValues applies it to the HistoricProcessInstanceQuery. Several operators (including NOT_EQUALS_IGNORE_CASE and any others not exposed on the public query API) are deliberately not supported here, hitting the default branch and throwing this FlowableIllegalArgumentException.
Source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/delete/BatchDeleteProcessConfig.java:394
break;
case LIKE_IGNORE_CASE:
query.variableValueLikeIgnoreCase(variableName, (String) extractVariableValue(variableValue, engineConfiguration));
break;
case EQUALS_IGNORE_CASE:
query.variableValueEqualsIgnoreCase(variableName, (String) extractVariableValue(variableValue, engineConfiguration));
break;
case EXISTS:
query.variableExists(variableName);
break;
case NOT_EXISTS:
query.variableNotExists(variableName);
break;
case NOT_EQUALS_IGNORE_CASE:
//Not exposed on the public API
//query.variableValueNotEqualsIgnoreCase(variableName, (String) extractVariableValue(variableValue, engineConfiguration));
//break
default:
throw new FlowableIllegalArgumentException("Operator " + operator + " is not supported for the variable value");
}
}
}
}
protected static Object extractVariableValue(JsonNode variableValueNode, ProcessEngineConfigurationImpl engineConfiguration) {
String type = variableValueNode.path("type").stringValue(null);
if (type == null) {
throw new FlowableIllegalArgumentException("The variable value does not have a type");
}
VariableType variableType = engineConfiguration.getVariableTypes()
.getVariableType(type);
return variableType.getValue(new VariableValueJsonNodeValueFields(variableValueNode));
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Use a supported operator such as EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN, LIKE etc.
- Replace NOT_EQUALS_IGNORE_CASE with an EQUALS filter plus client-side filtering, or restructure the query
- Check the Flowable version's switch statement in BatchDeleteProcessConfig for the exact supported operator set
Example fix
// before
{ "name": "status", "operator": "NOT_EQUALS_IGNORE_CASE", "value": "done" }
// after
{ "name": "status", "operator": "NOT_EQUALS", "value": "done" } Defensive patterns
Strategy: validation
Validate before calling
Set<String> supported = Set.of("EQUALS","NOT_EQUALS","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","LIKE","LIKE_IGNORE_CASE","EQUALS_IGNORE_CASE","IN");
if (!supported.contains(operatorString)) {
throw new IllegalArgumentException("Unsupported operator for batch delete query: " + operatorString);
} Try / catch
try {
config = BatchDeleteProcessConfig.create(partId, engineConfiguration);
} catch (FlowableIllegalArgumentException e) {
logger.error("Unsupported operator in batch config: " + e.getMessage());
} Prevention
- Use only operators exposed on HistoricProcessInstanceQuery's variable filters
- Do not assume every QueryOperator enum value works for batch delete queries
- Check the engine version's supported operator list
When it happens
Trigger: A batch configuration variableValue declares an operator such as NOT_EQUALS_IGNORE_CASE, or any operator that HistoricProcessInstanceQuery has no corresponding variable-filter method for in this code path.
Common situations: Copying operator names from the full QueryOperator enum without checking which are supported for batch delete queries; API changes between Flowable versions moving operators into the unsupported set.
Related errors
- The variable value does not contain an operator value
- The variable value does not have a type
- id is null
- batchId is null
- type is null
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/935ecea8abd22643.
Report an issue: GitHub.