apache/seatunnel · error · IllegalArgumentException

No data converter found for identifier: ${identifier}

Error message

No data converter found for identifier: ${identifier}

What it means

ConverterLoader.loadDataConverter looks up DataConverter implementations registered through ServiceLoader and matches identifier(). When no registered converter declares the requested identifier, this IllegalArgumentException is thrown.

Source

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

                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) {
        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<>();

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Correct the identifier in the connector configuration to a registered value
  2. Make sure the converter's jar is in the plugin directory and SPI file (META-INF/services) is present
  3. Pass an explicit ClassLoader that can see the plugin classes if the thread context classloader is wrong

Example fix

// before
DataConverter<?> c = ConverterLoader.loadDataConverter("dataconv-mysql-v2");
// after
DataConverter<?> c = ConverterLoader.loadDataConverter("mysql", pluginClassLoader);
Defensive patterns

Strategy: try-catch

Validate before calling

ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl == null) cl = ConverterLoader.class.getClassLoader();
DataConverter<?> c = ConverterLoader.loadDataConverter(identifier, cl); // explicit CL

Try / catch

try {
    DataConverter<?> c = ConverterLoader.loadDataConverter(identifier);
} catch (IllegalArgumentException e) {
    log.error("DataConverter '{}' not found; verify SPI registration and classpath", identifier);
    throw e;
}

Prevention

When it happens

Trigger: loadDataConverter(identifier[, classLoader]) called with an identifier that no discoverable DataConverter matches; the default overload uses the thread context classloader, which may not see plugin jars.

Common situations: Misspelled converter identifier in connector config; plugin jar not shipped; context classloader null/limited in embedded or engine-submitted jobs.

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/08d3d7b8a300c986. Report an issue: GitHub.