grpc/grpc-java · error · IllegalArgumentException
Address types of NameResolver '%s' for '%s' not supported by
Error message
Address types of NameResolver '%s' for '%s' not supported by transport
What it means
gRPC validates at channel-build time that every SocketAddress type the NameResolver produces can be understood by the channel's transport. If the name resolver emits address types (e.g. ExternalAddress / custom subclasses) the transport has not registered support for, the builder fails fast with this IllegalArgumentException rather than failing later at connect time.
Source
Thrown at core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java:891
}
@VisibleForTesting
static class ResolvedNameResolver {
public final UriWrapper targetUri;
public final NameResolverProvider provider;
public ResolvedNameResolver(UriWrapper targetUri, NameResolverProvider provider) {
this.targetUri = checkNotNull(targetUri, "targetUri");
this.provider = checkNotNull(provider, "provider");
}
void checkAddressTypes(
Collection<Class<? extends SocketAddress>> channelTransportSocketAddressTypes) {
if (channelTransportSocketAddressTypes != null) {
Collection<Class<? extends SocketAddress>> nameResolverSocketAddressTypes =
provider.getProducedSocketAddressTypes();
if (!channelTransportSocketAddressTypes.containsAll(nameResolverSocketAddressTypes)) {
throw new IllegalArgumentException(
String.format(
"Address types of NameResolver '%s' for '%s' not supported by transport",
provider.getDefaultScheme(), targetUri));
}
}
}
}
@VisibleForTesting
static ResolvedNameResolver getNameResolverProvider(
String target, NameResolverRegistry nameResolverRegistry,
NameResolverProvider nameResolverProvider) {
// Finding a NameResolver. Try using the target string as the URI. If that fails, try prepending
// "dns:///".
NameResolverProvider provider = null;
URI targetUri = null;
StringBuilder uriSyntaxErrors = new StringBuilder();
try {View on GitHub (pinned to 64daddc1f3)
Solutions
- Register the transport's supported address types so it covers all classes the resolver produces, or make the resolver produce supported address types (e.g. InetSocketAddress)
- Return the correct set from NameResolverProvider.getProducedSocketAddressTypes() matching what the resolver actually emits
- Use a transport that supports the resolver's address types (e.g. an ExternalAddress-aware transport for ExternalAddress)
- Bypass the check only deliberately by not registering the resolver against the channel that performs verification
Example fix
// before
public Collection<Class<? extends SocketAddress>> getProducedSocketAddressTypes() {
return Collections.singleton(ExternalAddress.class);
}
// after
public Collection<Class<? extends SocketAddress>> getProducedSocketAddressTypes() {
return Collections.singleton(InetSocketAddress.class);
} Defensive patterns
Strategy: validation
Validate before calling
Collection<Class<? extends SocketAddress>> resolverTypes = provider.getProducedSocketAddressTypes();
if (!transport.getSupportedSocketAddressTypes().containsAll(resolverTypes)) {
throw new IllegalArgumentException("resolver address types unsupported by transport");
} Try / catch
try { ManagedChannelBuilder.forTarget(t).build(); } catch (IllegalArgumentException e) { if (e.getMessage().contains("not supported by transport")) { /* swap resolver or transport */ } else throw e; } Prevention
- Keep getProducedSocketAddressTypes() in sync with the transport's supported types
- Test channel construction for every registered custom name resolver
- Prefer standard InetSocketAddress-producing resolvers unless the transport explicitly supports external addresses
When it happens
Trigger: Building a channel via ManagedChannelImplBuilder/forAddress with a custom NameResolverProvider whose getProducedSocketAddressTypes() returns address classes not contained in the transport's supported SocketAddress types, when nameResolverRegistry verification (checkAddressTypes) is enabled.
Common situations: Registering a custom name resolver that produces ExternalAddress objects against a transport (e.g. a plain netty/inprocess channel) that only supports InetSocketAddress; using a custom provider with a mismatched getDefaultScheme and transport.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- Could not find a NameResolverProvider for %s%s
- No functional channel service provider found. Try adding a d
- ChannelLogger is not set in Builder
- NameResolverRegistry is not set in Builder
- ${result.error}
AI-assisted analysis of grpc/grpc-java@64daddc1f3 (2026-09-08).
Data as JSON: /api/errors/898fa0dce2e1165a.
Report an issue: GitHub.