apache/seatunnel · error · IllegalArgumentException

No data type converter found for identifier: ${identifier}

Error message

No data type converter found for identifier: ${identifier}

What it means

ConverterLoader.loadDataTypeConverter discovers DataTypeConverter implementations via Java ServiceLoader and matches them against the given identifier string. If no discovered converter's identifier() equals the requested one, it throws this IllegalArgumentException.

Source

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

import java.util.List;
import java.util.ServiceLoader;

public class ConverterLoader {

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

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

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

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

    public static TypeConverter<?> loadTypeConverter(String identifier) {

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Verify the identifier string against the identifier() of the converter implementation you intend to use
  2. Ensure the jar containing the converter is on the classpath/plugin directory so ServiceLoader can find it (run install-plugin.sh if needed)
  3. Check for version drift: the converter may exist only in newer/older SeaTunnel versions

Example fix

// before
DataConverter<?> c = ConverterLoader.loadDataTypeConverter("mysql-cdc-converter"); // no such id
// after
DataConverter<?> c = ConverterLoader.loadDataTypeConverter("mysql");
Defensive patterns

Strategy: try-catch

Validate before calling

String id = cfg.getConverterIdentifier();
assert id != null && !id.isEmpty();
// verify against registered identifiers before calling

Try / catch

try {
    DataTypeConverter c = ConverterLoader.loadDataTypeConverter(identifier);
} catch (IllegalArgumentException e) {
    throw new IllegalArgumentException("Unknown converter id '" + identifier + "'; check plugin installation and spelling", e);
}

Prevention

When it happens

Trigger: Calling loadDataTypeConverter(identifier) with a converter identifier that no SPI-registered DataTypeConverter declares, including typos or wrong-case strings.

Common situations: Configuring a connector's converter option with a name not in the classpath (plugin jar missing, different SeaTunnel version, misspelled identifier).

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/1a992e85bff3b6bb. Report an issue: GitHub.