flowable/flowable-engine · error · FlowableIllegalArgumentException

Only string variable values are supported when ignoring…

Error message

Only string variable values are supported when ignoring casing, but was: ${valueType}

What it means

FlowableIllegalArgumentException thrown when variableValueEqualsIgnoreCase (or processVariableValueEqualsIgnoreCase) is requested but the provided value is not a String. Case-insensitive comparison is only defined for string values, so the endpoint casts to String and rejects any other type.

Solutions

  1. Send the value as a JSON string, e.g. "value":"100" with operation equalsIgnoreCase.
  2. For non-string values use the plain equals operation instead of the ignore-case variant.
  3. Coerce values to String client-side before choosing the ignoreCase operation.
  4. Catch FlowableIllegalArgumentException (HTTP 400) and retry with equals when the value is not a string.

Example fix

// before
{"variables":[{"name":"status","value":100,"operation":"equalsIgnoreCase"}]}
// after
{"variables":[{"name":"status","value":"active","operation":"equalsIgnoreCase"}]}
Defensive patterns

Strategy: validation

Validate before calling

for (const v of query.variables) {
  if (v.operation === 'equalsIgnoreCase' && typeof v.value !== 'string')
    throw new Error(`equalsIgnoreCase requires a string value, got ${typeof v.value}`);
}

Type guard

const isIgnoreCaseSafe = (v) => !/IgnoreCase$/i.test(v.operation || '') || typeof v.value === 'string';

Try / catch

try { /* query */ } catch (e) {
  if (e.status === 400 && /Only string variable values are supported when ignoring casing/.test(e.message)) {
    // retry with plain equals
  } else throw e;
}

Prevention

When it happens

Trigger: POST /query/process-instances or /query/executions with variables:[{"name":"amount","value":100,"operation":"equalsIgnoreCase"}] where value deserializes to a non-String type (Integer, Boolean, etc.).

Common situations: Client sends numbers/booleans with an ignoreCase operation; JSON numbers deserialized to Integer; user assumes ignoreCase is a generic case-insensitive equality for any type.

Understand the failure class

Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-rest/src/main/java/org/flowable/rest/service/api/runtime/process/ExecutionBaseResource.java:169

                    }
                } else {
                    if (process) {
                        processInstanceQuery.processVariableValueEquals(variable.getName(), actualValue);
                    } else {
                        processInstanceQuery.variableValueEquals(variable.getName(), actualValue);
                    }
                }
                break;

            case EQUALS_IGNORE_CASE:
                if (actualValue instanceof String) {
                    if (process) {
                        processInstanceQuery.processVariableValueEqualsIgnoreCase(variable.getName(), (String) actualValue);
                    } else {
                        processInstanceQuery.variableValueEqualsIgnoreCase(variable.getName(), (String) actualValue);
                    }
                } else {
                    throw new FlowableIllegalArgumentException("Only string variable values are supported when ignoring casing, but was: " + actualValue.getClass().getName());
                }
                break;

            case NOT_EQUALS:
                if (process) {
                    processInstanceQuery.processVariableValueNotEquals(variable.getName(), actualValue);
                } else {
                    processInstanceQuery.variableValueNotEquals(variable.getName(), actualValue);
                }
                break;

            case NOT_EQUALS_IGNORE_CASE:
                if (actualValue instanceof String) {
                    if (process) {
                        processInstanceQuery.processVariableValueNotEqualsIgnoreCase(variable.getName(), (String) actualValue);
                    } else {
                        processInstanceQuery.variableValueNotEqualsIgnoreCase(variable.getName(), (String) actualValue);
                    }

View on GitHub (pinned to d6d39ce1c6)