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
Thrown by populateQueryVariableValues() when the operator parsed from the JSON falls into the switch's default branch, i.e. it is a valid QueryOperator enum value that the HistoricCaseInstanceQuery variable-value API does not expose (e.g. EQUALS_IGNORE_CASE / NOT_EQUALS_IGNORE_CASE). Notably NOT_EQUALS_IGNORE_CASE is deliberately commented out as not exposed on the public API.
Source
Thrown at modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/delete/BatchDeleteCaseConfig.java:372
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, CmmnEngineConfiguration 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, GREATER_THAN_OR_EQUALS, LESS_THAN, LESS_THAN_OR_EQUALS, LIKE
- Replace unsupported ignore-case operators with EQUALS plus normalized (lowercased) values in the data/query
- Update Flowable to a version whose switch handles the operator, if available
Example fix
// before
{"name":"status","operator":"NOT_EQUALS_IGNORE_CASE","value":"closed"}
// after
{"name":"status","operator":"NOT_EQUALS","value":"closed"} Defensive patterns
Strategy: validation
Validate before calling
EnumSet<QueryOperator> allowed = EnumSet.of(EQUALS, NOT_EQUALS, GREATER_THAN, GREATER_THAN_OR_EQUALS, LESS_THAN, LESS_THAN_OR_EQUALS, LIKE);
if (!allowed.contains(operator)) throw new IllegalArgumentException("operator not supported for historic case query: " + operator); Type guard
boolean isSupportedOperator(String op) { try { return allowedSet().contains(QueryOperator.valueOf(op)); } catch (Exception e) { return false; } } Try / catch
try { createBatch(cmd); } catch (FlowableIllegalArgumentException e) { if (e.getMessage().contains("not supported for the variable value")) { log.error("Unsupported operator; use EQUALS/NOT_EQUALS/LIKE etc.", e); } throw e; } Prevention
- Restrict user-facing filter builders to operators the historic query API exposes
- Do not use *IGNORE_CASE operators in batch query JSON
- Recheck supported operators when upgrading Flowable
When it happens
Trigger: A variable value node in the batch configuration JSON uses operator EQUALS_IGNORE_CASE, NOT_EQUALS_IGNORE_CASE, or another QueryOperator not handled in the switch.
Common situations: Copy-pasting operator names from the QueryOperator enum without checking public API support; batch JSON authored for a runtime query that supports more operators; version drift adding enum values not yet handled.
Related errors
- Query property ${property} is not supported
- The variable value does not contain an operator value
- The variable value does not have a type
- query is null
- parentScopeIds is null or empty
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/184d4c64ed04e292.
Report an issue: GitHub.