{"record":{"id":"08d3d7b8a300c986","repo":"apache/seatunnel","slug":"no-data-converter-found-for-identifier-identifi","errorCode":null,"errorMessage":"No data converter found for identifier: ${identifier}","messagePattern":"No data converter found for identifier: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-api/src/main/java/org/apache/seatunnel/api/table/converter/ConverterLoader.java","lineNumber":55,"sourceCode":"                return dataTypeConverter;\n            }\n        }\n        throw new IllegalArgumentException(\n                \"No data type converter found for identifier: \" + identifier);\n    }\n\n    public static DataConverter<?> loadDataConverter(String identifier) {\n        return loadDataConverter(identifier, Thread.currentThread().getContextClassLoader());\n    }\n\n    public static DataConverter<?> loadDataConverter(String identifier, ClassLoader classLoader) {\n        List<DataConverter> converters = discoverConverters(DataConverter.class, classLoader);\n        for (DataConverter dataConverter : converters) {\n            if (dataConverter.identifier().equals(identifier)) {\n                return dataConverter;\n            }\n        }\n        throw new IllegalArgumentException(\"No data converter found for identifier: \" + identifier);\n    }\n\n    public static TypeConverter<?> loadTypeConverter(String identifier) {\n        return loadTypeConverter(identifier, Thread.currentThread().getContextClassLoader());\n    }\n\n    public static TypeConverter<?> loadTypeConverter(String identifier, ClassLoader classLoader) {\n        List<TypeConverter> converters = discoverConverters(TypeConverter.class, classLoader);\n        for (TypeConverter typeConverter : converters) {\n            if (typeConverter.identifier().equals(identifier)) {\n                return typeConverter;\n            }\n        }\n        throw new IllegalArgumentException(\"No type converter found for identifier: \" + identifier);\n    }\n\n    private static <T> List<T> discoverConverters(Class<T> clazz, ClassLoader classLoader) {\n        List<T> converters = new ArrayList<>();","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/converter/ConverterLoader.java#L37-L73","documentation":"ConverterLoader.loadDataConverter looks up DataConverter implementations registered through ServiceLoader and matches identifier(). When no registered converter declares the requested identifier, this IllegalArgumentException is thrown.","triggerScenarios":"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.","commonSituations":"Misspelled converter identifier in connector config; plugin jar not shipped; context classloader null/limited in embedded or engine-submitted jobs.","solutions":["Correct the identifier in the connector configuration to a registered value","Make sure the converter's jar is in the plugin directory and SPI file (META-INF/services) is present","Pass an explicit ClassLoader that can see the plugin classes if the thread context classloader is wrong"],"exampleFix":"// before\nDataConverter<?> c = ConverterLoader.loadDataConverter(\"dataconv-mysql-v2\");\n// after\nDataConverter<?> c = ConverterLoader.loadDataConverter(\"mysql\", pluginClassLoader);","handlingStrategy":"try-catch","validationCode":"ClassLoader cl = Thread.currentThread().getContextClassLoader();\nif (cl == null) cl = ConverterLoader.class.getClassLoader();\nDataConverter<?> c = ConverterLoader.loadDataConverter(identifier, cl); // explicit CL","typeGuard":null,"tryCatchPattern":"try {\n    DataConverter<?> c = ConverterLoader.loadDataConverter(identifier);\n} catch (IllegalArgumentException e) {\n    log.error(\"DataConverter '{}' not found; verify SPI registration and classpath\", identifier);\n    throw e;\n}","preventionTips":["Ensure the thread context classloader can see plugin jars in embedded contexts","Verify META-INF/services entries exist in the converter jar","Validate identifiers in config at job-submission time"],"tags":["java","spi","service-loader"],"backgroundTag":"resource-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}