grpc/grpc-java · error · IllegalArgumentException

Could not find a NameResolverProvider for %s%s

Error message

Could not find a NameResolverProvider for %s%s

What it means

When building a channel from a target string with a URI-style scheme, gRPC looks up a NameResolverProvider registered for the target URI's scheme. If the URI parses but no provider is registered for that scheme, the builder throws this IllegalArgumentException.

Source

Thrown at core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java:948

      // the provider's default scheme (if provider is specified).
      String scheme = nameResolverProvider != null
          ? nameResolverProvider.getScheme()
          : nameResolverRegistry.getDefaultScheme();
      try {
        targetUri = new URI(scheme, "", "/" + target, null);
      } catch (URISyntaxException e) {
        // Should not be possible
        throw new IllegalArgumentException(e);
      }
      if (nameResolverProvider != null) {
        provider = nameResolverProvider;
      } else {
        provider = nameResolverRegistry.getProviderForScheme(targetUri.getScheme());
      }
    }

    if (provider == null) {
      throw new IllegalArgumentException(String.format(
          "Could not find a NameResolverProvider for %s%s",
          target, uriSyntaxErrors.length() > 0 ? " (" + uriSyntaxErrors + ")" : ""));
    }

    return new ResolvedNameResolver(wrap(targetUri), provider);
  }

  @VisibleForTesting
  static ResolvedNameResolver getNameResolverProviderRfc3986(
      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 {
      targetUri = Uri.parse(target);

View on GitHub (pinned to 64daddc1f3)

Solutions

  1. Fix the target string's scheme (e.g. use "dns:///host:port") or drop the scheme to use the default resolver
  2. Register the NameResolverProvider in NameResolverRegistry.getDefaultRegistry() before building the channel
  3. Add the missing provider dependency to the classpath (e.g. grpc-services for dns)
  4. Fix URI syntax errors reported in parentheses in the message

Example fix

// before
ManagedChannel c = ManagedChannelBuilder.forTarget("foo://myhost:50051").build();
// after
ManagedChannel c = ManagedChannelBuilder.forTarget("dns:///myhost:50051").build();
Defensive patterns

Strategy: validation

Validate before calling

NameResolverProvider p = NameResolverRegistry.getDefaultRegistry().getProviderForScheme(uri.getScheme());
if (p == null) throw new IllegalArgumentException("No NameResolverProvider for scheme " + uri.getScheme());

Try / catch

try { channel = ManagedChannelBuilder.forTarget(target).build(); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith("Could not find a NameResolverProvider")) { /* fix target or register provider */ } else throw e; }

Prevention

When it happens

Trigger: ChannelBuilder.forTarget("foo://host:port") (or nameResolverFactory usage) where targetUri.getScheme() has no registered NameResolverProvider, or provider lookup returned null after URI parsing with syntax errors appended.

Common situations: Typo in scheme (e.g. "dns3://"), relying on a name-resolver provider (like dns) not on the classpath, custom resolver provider never registered in NameResolverRegistry, shaded jars hiding META-INF/services entries.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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