apache/seatunnel · error · org.apache.seatunnel.api.metadata.MetadataProviderException
No MetadataProvider found for kind
Error message
No MetadataProvider found for kind '%s'. Available provider kinds are: %s
What it means
MetadataProviderFactory.getProvider iterated every loaded SPI implementation and none had a kind() equal (case-insensitively) to the requested kind. The message lists the kinds that are actually available, which usually shows a typo or a missing plugin jar. The input at fault is the 'kind' string requested by the caller (e.g. the metadata datasource config in seatunnel.yaml).
Solutions
- Compare the requested kind with the 'Available provider kinds' list in the message and fix typos/case differences
- Install the connector/plugin jar that provides the missing MetadataProvider kind
- If writing a custom provider, verify its kind() matches what the datasource config references and that it is registered via SPI
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/metadata/MetadataProviderFactory.java:80 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/ad998004146105a1.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/metadata/MetadataProviderFactory.java:80
matchedKinds);
throw new MetadataProviderException(
String.format(
"Multiple MetadataProvider implementations found for kind '%s'.\n\n"
+ "Ambiguous provider classes are:\n\n%s",
kind, String.join("\n", matchedKinds)));
}
matchedProvider = provider;
matchedKinds.add(provider.getClass().getName());
}
}
if (matchedProvider == null) {
List<String> availableKinds = new ArrayList<>();
for (MetadataProvider provider : providers) {
availableKinds.add(provider.kind());
}
log.debug("No MetadataProvider found for kind: {}", kind);
throw new MetadataProviderException(
String.format(
"No MetadataProvider found for kind '%s'.\n\n"
+ "Available provider kinds are:\n\n%s",
kind, String.join("\n", availableKinds)));
}
return matchedProvider;
}
/**
* Clears the provider cache.
*
* <p>This method is primarily intended for testing purposes. Currently, this method does
* nothing as providers are loaded on-demand via SPI without caching.
*/
public static void clearCache() {
// No-op for testing compatibility
}View on GitHub (pinned to cf67b549a7)