elastic/elasticsearch · error · IllegalArgumentException

field [{}] of type [{}] cannot be cast to [{}]

Error message

field [{}] of type [{}] cannot be cast to [{}]

What it means

Thrown by DataStreamValueSource.getStringFieldValueInDottedNotation when the resolved field-reference value in the document's context map is non-null but not a String. The reroute processor needs string values for data stream name components.

Source

Thrown at modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/RerouteProcessor.java:295

        public String resolve(IngestDocument ingestDocument) {
            if (fieldReference != null) {
                String value = ingestDocument.getFieldValue(fieldReference, String.class, true);
                if (value == null) {
                    value = getStringFieldValueInDottedNotation(ingestDocument);
                }
                return sanitizer.apply(value);
            } else {
                return value;
            }
        }

        private String getStringFieldValueInDottedNotation(IngestDocument ingestDocument) {
            String value = null;
            Object valueObject = ingestDocument.getCtxMap().get(fieldReference);
            if (valueObject instanceof String) {
                value = (String) valueObject;
            } else if (valueObject != null) {
                throw new IllegalArgumentException(
                    "field ["
                        + fieldReference
                        + "] of type ["
                        + valueObject.getClass().getName()
                        + "] cannot be cast to ["
                        + String.class.getName()
                        + "]"
                );
            }
            return value;
        }
    }
}

View on GitHub (pinned to db6a809a66)

Solutions

  1. Ensure the referenced field contains a string value before the reroute processor runs.
  2. Use a convert processor upstream to cast the field to string.
  3. Reference a different field that is guaranteed to be a string.

Example fix

// before: env_id is numeric
{
  "convert": { "field": "env_id", "type": "string" } },
{
  "reroute": { "namespace": "{{env_id}}" } }
// after
{
  "convert": { "field": "env_id", "type": "string" } },
{
  "reroute": { "namespace": "{{env_id}}" } }
Defensive patterns

Strategy: type-guard

Validate before calling

// Verify the referenced field is a String before reroute resolves it
Object v = document.getFieldValue("env_id", Object.class, true);
if (v != null && !(v instanceof String)) {
    // convert upstream or pick a different field
}

Type guard

boolean isStringField(IngestDocument doc, String field) {
    Object v = doc.getFieldValue(field, Object.class, true);
    return v == null || v instanceof String;
}

Try / catch

try {
    // run reroute processor with field reference
} catch (IllegalArgumentException e) {
    if (e.getMessage().contains("cannot be cast to")) {
        // add a convert processor to cast the field to string upstream
    } else { throw e; }
}

Prevention

When it happens

Trigger: The field referenced by '{{field}}' in a reroute type/dataset/namespace config resolves to a non-string object (e.g., a number, boolean, object, or list) in the document.

Common situations: Referencing a numeric field like port or count as a namespace. Referencing an object/array field. Field type changes in upstream data causing a previously-string field to become numeric.

Related errors


AI-assisted analysis of elastic/elasticsearch@db6a809a66 (2026-08-12). Data as JSON: /api/errors/8130e775a29f5d6b. Report an issue: GitHub.