quarkusio/quarkus · error · RuntimeException

Multiple providers found for REST Client '${class}'. Please

Error message

Multiple providers found for REST Client '${class}'. Please specify one by setting 'quarkus.rest-client."${class}".local-proxy-provider' to one the following providers: ${providers}

What it means

When a REST Client's proxy provider is not explicitly configured and multiple non-default providers are registered, Dev Services cannot decide which one to use and throws a RuntimeException listing all candidates. Resolution requires setting `quarkus.rest-client."<client>".local-proxy-provider` to one of the listed names.

Source

Thrown at extensions/resteasy-reactive/rest-client/deployment/src/main/java/io/quarkus/rest/client/reactive/deployment/devservices/DevServicesRestClientHttpProxyProcessor.java:144

            } else {
                // the algorithm is the following:
                // if only the default is around, use it
                // if there is only one besides the default, use it
                // if there are multiple ones, fail

                List<DevServicesRestClientProxyProvider.BuildItem> nonDefault = restClientProxyProviderBuildItems.stream()
                        .filter(pib -> !pib.getProvider().name().equals(VertxHttpProxyDevServicesRestClientProxyProvider.NAME))
                        .toList();
                if (nonDefault.isEmpty()) {
                    provider = VertxHttpProxyDevServicesRestClientProxyProvider.INSTANCE;
                } else if (nonDefault.size() == 1) {
                    // TODO: this part of the algorithm is questionable...
                    provider = nonDefault.iterator().next().getProvider();
                } else {
                    String availableProviders = restClientProxyProviderBuildItems.stream().map(bi -> bi.getProvider().name())
                            .collect(
                                    Collectors.joining(","));
                    throw new RuntimeException("Multiple providers found for REST Client '" + toStart.getClassName()
                            + "'. Please specify one by setting 'quarkus.rest-client.\"" + toStart.getClassName()
                            + "\".local-proxy-provider' to one the following providers: " + availableProviders);
                }
            }

            biToProviderMap.put(toStart, provider);
        }

        // here is where we set up providers
        var providersToRun = new HashSet<>(biToProviderMap.values());
        providersToRun.removeAll(runningProviders.get());
        for (var provider : providersToRun) {
            Closeable closeable = provider.setup();
            if (closeable != null) {
                providerCloseables.get().add(closeable);
            }
            runningProviders.get().add(provider);
        }

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set `quarkus.rest-client."<client-class>".local-proxy-provider` to one of the provider names listed in the message
  2. Remove one of the competing provider extensions if it is unneeded
  3. Check if one provider extension offers default configuration that should be preferred

Example fix

// before
(no provider configured; kafka and redis both registered)
// after
quarkus.rest-client."org.acme.MyClient".local-proxy-provider=kafka
Defensive patterns

Strategy: validation

Validate before calling

// Guard: ensure at most one proxy-provider extension per client when no explicit provider is set
String explicit = config.getValue("quarkus.rest-client.\"org.acme.MyClient\".local-proxy-provider", String.class, null);
int providerExtensions = 2; // count registered provider extensions in the project
if (explicit == null && providerExtensions > 1) {
  throw new IllegalStateException("Set quarkus.rest-client.\"org.acme.MyClient\".local-proxy-provider");
}

Prevention

When it happens

Trigger: Two or more extensions register RestClientProxyProviderBuildItems, none is marked default, and no `local-proxy-provider` is set for the client.

Common situations: Adding a second provider extension (e.g. both Kafka and another proxy provider) to a project that previously had one; upgrading Quarkus where a previously-default provider lost its default status.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/8627a088e9cf6bcc. Report an issue: GitHub.