grpc/grpc-java · error · IllegalArgumentException

Could not find a NameResolverProvider for

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.

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.

Appendix: 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)