{"record":{"id":"6ccbf4b947fdcccc","repo":"apache/seatunnel","slug":"no-type-converter-found-for-identifier-identifi","errorCode":null,"errorMessage":"No type converter found for identifier: ${identifier}","messagePattern":"No type 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":69,"sourceCode":"            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<>();\n        ServiceLoader.load(clazz, classLoader).forEach(t -> converters.add(t));\n        return converters;\n    }\n}\n","sourceCodeStart":51,"sourceCodeEnd":78,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-api/src/main/java/org/apache/seatunnel/api/table/converter/ConverterLoader.java#L51-L78","documentation":"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.","triggerScenarios":"loadTypeConverter(identifier[, classLoader]) invoked with an identifier that no SPI-registered TypeConverter declares.","commonSituations":"Wrong converter name in connector config; missing plugin jar; different SeaTunnel version without that converter.","solutions":["Check available TypeConverter implementations and use a valid identifier","Install the plugin providing the converter (sh bin/install-plugin.sh)","If running embedded, supply a ClassLoader that includes the converter jar"],"exampleFix":"// before\nTypeConverter<?> tc = ConverterLoader.loadTypeConverter(\"typconv-jsonx\");\n// after\nTypeConverter<?> tc = ConverterLoader.loadTypeConverter(\"json\");","handlingStrategy":"try-catch","validationCode":"String id = config.getTypeConverter();\nassert id != null;","typeGuard":null,"tryCatchPattern":"try {\n    TypeConverter<?> tc = ConverterLoader.loadTypeConverter(identifier);\n} catch (IllegalArgumentException e) {\n    throw new IllegalArgumentException(\"TypeConverter '\" + identifier + \"' not registered; install the plugin or fix the id\", e);\n}","preventionTips":["List available TypeConverters before choosing an identifier","Keep engine and plugin versions aligned","Fail fast at config parsing with a clear message"],"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-14T11:17:12.474Z"}