apache/seatunnel · error · IllegalArgumentException

No type converter found for identifier: ${identifier}

Error message

No type converter found for identifier: ${identifier}

What it means

ConverterLoader.loadTypeConverter scans TypeConverter implementations via ServiceLoader and returns the one whose identifier() matches; otherwise it throws this IllegalArgumentException. It means the requested type converter is not registered in the visible classloader.

Source

Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/table/converter/ConverterLoader.java:69

            if (dataConverter.identifier().equals(identifier)) {
                return dataConverter;
            }
        }
        throw new IllegalArgumentException("No data converter found for identifier: " + identifier);
    }

    public static TypeConverter<?> loadTypeConverter(String identifier) {
        return loadTypeConverter(identifier, Thread.currentThread().getContextClassLoader());
    }

    public static TypeConverter<?> loadTypeConverter(String identifier, ClassLoader classLoader) {
        List<TypeConverter> converters = discoverConverters(TypeConverter.class, classLoader);
        for (TypeConverter typeConverter : converters) {
            if (typeConverter.identifier().equals(identifier)) {
                return typeConverter;
            }
        }
        throw new IllegalArgumentException("No type converter found for identifier: " + identifier);
    }

    private static <T> List<T> discoverConverters(Class<T> clazz, ClassLoader classLoader) {
        List<T> converters = new ArrayList<>();
        ServiceLoader.load(clazz, classLoader).forEach(t -> converters.add(t));
        return converters;
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Check available TypeConverter implementations and use a valid identifier
  2. Install the plugin providing the converter (sh bin/install-plugin.sh)
  3. If running embedded, supply a ClassLoader that includes the converter jar

Example fix

// before
TypeConverter<?> tc = ConverterLoader.loadTypeConverter("typconv-jsonx");
// after
TypeConverter<?> tc = ConverterLoader.loadTypeConverter("json");
Defensive patterns

Strategy: try-catch

Validate before calling

String id = config.getTypeConverter();
assert id != null;

Try / catch

try {
    TypeConverter<?> tc = ConverterLoader.loadTypeConverter(identifier);
} catch (IllegalArgumentException e) {
    throw new IllegalArgumentException("TypeConverter '" + identifier + "' not registered; install the plugin or fix the id", e);
}

Prevention

When it happens

Trigger: loadTypeConverter(identifier[, classLoader]) invoked with an identifier that no SPI-registered TypeConverter declares.

Common situations: Wrong converter name in connector config; missing plugin jar; different SeaTunnel version without that converter.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/6ccbf4b947fdcccc. Report an issue: GitHub.