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

  1. 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)
  2. Return the correct set from NameResolverProvider.getProducedSocketAddressTypes() matching what the resolver actually emits
  3. Use a transport that supports the resolver's address types (e.g. an ExternalAddress-aware transport for ExternalAddress)
  4. 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

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


AI-assisted analysis of grpc/grpc-java@64daddc1f3 (2026-09-08). Data as JSON: /api/errors/898fa0dce2e1165a. Report an issue: GitHub.