diff --git a/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceGroupConfigurer.java b/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceGroupConfigurer.java index 3f2c8849dd2..2f6834f0dff 100644 --- a/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceGroupConfigurer.java +++ b/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceGroupConfigurer.java @@ -16,8 +16,6 @@ package org.springframework.web.service.registry; -import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Predicate; import org.springframework.core.Ordered; @@ -66,29 +64,54 @@ public interface HttpServiceGroupConfigurer extends Ordered { Groups filter(Predicate predicate); /** - * Configure the client for the selected groups. - * This is called once for each selected group. + * Configure the client of each {@link #filter(Predicate) filtered} group. */ - void configureClient(Consumer clientConfigurer); + void forEachClient(ForClient configurer); /** - * Variant of {@link #configureClient(Consumer)} with access to the - * group being configured. + * Configure the {@code HttpServiceProxyFactory} of each + * {@link #filter(Predicate) filtered} group. */ - void configureClient(BiConsumer clientConfigurer); + void forEachProxyFactory(ForProxyFactory configurer); /** - * Configure the {@link HttpServiceProxyFactory} for the selected groups. - * This is called once for each selected group. + * Configure the client and the {@code HttpServiceProxyFactory} of each + * {@link #filter(Predicate) filtered} group. */ - void configureProxyFactory(BiConsumer proxyFactoryConfigurer); + void forEachGroup(ForGroup groupConfigurer); + } - /** - * Configure the client and {@link HttpServiceProxyFactory} for the selected groups. - * This is called once for each selected group. - */ - void configure(BiConsumer clientConfigurer, - BiConsumer proxyFactoryConfigurer); + + /** + * Callback to configure the client for a group. + * @param the type of client builder, i.e. {@code RestClient} or {@code WebClient} builder. + */ + @FunctionalInterface + interface ForClient { + + void configureClient(HttpServiceGroup group, CB clientBuilder); + } + + + /** + * Callback to configure the {@code HttpServiceProxyFactory} for a group. + */ + @FunctionalInterface + interface ForProxyFactory { + + void configureProxyFactory(HttpServiceGroup group, HttpServiceProxyFactory.Builder factoryBuilder); + } + + + /** + * Callback to configure the client and {@code HttpServiceProxyFactory} for a group. + * @param the type of client builder, i.e. {@code RestClient} or {@code WebClient} builder. + */ + @FunctionalInterface + interface ForGroup { + + void configureGroup(HttpServiceGroup group, + CB clientBuilder, HttpServiceProxyFactory.Builder factoryBuilder); } } diff --git a/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBean.java b/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBean.java index ba95d1d3481..d25777c23b5 100644 --- a/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBean.java +++ b/spring-web/src/main/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBean.java @@ -22,8 +22,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -166,7 +164,7 @@ public final class HttpServiceProxyRegistryFactoryBean private final Object clientBuilder; - private BiConsumer proxyFactoryConfigurer = (group, builder) -> {}; + private final HttpServiceProxyFactory.Builder proxyFactoryBuilder = HttpServiceProxyFactory.builder(); ProxyHttpServiceGroup(HttpServiceGroup group) { this.declaredGroup = group; @@ -196,20 +194,13 @@ public final class HttpServiceProxyRegistryFactoryBean } @SuppressWarnings("unchecked") - public void apply( - BiConsumer clientConfigurer, - BiConsumer proxyFactoryConfigurer) { - - clientConfigurer.accept(this, (CB) this.clientBuilder); - this.proxyFactoryConfigurer = this.proxyFactoryConfigurer.andThen(proxyFactoryConfigurer); + public void applyConfigurer(HttpServiceGroupConfigurer.ForGroup configurer) { + configurer.configureGroup(this, (CB) this.clientBuilder, this.proxyFactoryBuilder); } public Map, Object> createProxies() { Map, Object> map = new LinkedHashMap<>(httpServiceTypes().size()); - HttpExchangeAdapter exchangeAdapter = initExchangeAdapter(); - HttpServiceProxyFactory.Builder proxyFactoryBuilder = HttpServiceProxyFactory.builderFor(exchangeAdapter); - this.proxyFactoryConfigurer.accept(this, proxyFactoryBuilder); - HttpServiceProxyFactory factory = proxyFactoryBuilder.build(); + HttpServiceProxyFactory factory = this.proxyFactoryBuilder.exchangeAdapter(initExchangeAdapter()).build(); httpServiceTypes().forEach(type -> map.put(type, factory.createClient(type))); return map; } @@ -256,32 +247,21 @@ public final class HttpServiceProxyRegistryFactoryBean } @Override - public void configureClient(Consumer clientConfigurer) { - configureClient((group, builder) -> clientConfigurer.accept(builder)); + public void forEachClient(HttpServiceGroupConfigurer.ForClient configurer) { + forEachGroup((group, clientBuilder, factoryBuilder) -> + configurer.configureClient(group, clientBuilder)); } @Override - public void configureClient(BiConsumer clientConfigurer) { - configure(clientConfigurer, (group, builder) -> {}); + public void forEachProxyFactory(HttpServiceGroupConfigurer.ForProxyFactory configurer) { + forEachGroup((group, clientBuilder, factoryBuilder) -> + configurer.configureProxyFactory(group, factoryBuilder)); } @Override - public void configureProxyFactory( - BiConsumer proxyFactoryConfigurer) { - - configure((group, builder) -> {}, proxyFactoryConfigurer); - } - - @Override - public void configure( - BiConsumer clientConfigurer, - BiConsumer proxyFactoryConfigurer) { - - this.groups.stream().filter(this.filter) - .forEach(group -> group.apply(clientConfigurer, proxyFactoryConfigurer)); - - // Reset filter - this.filter = this.defaultFilter; + public void forEachGroup(HttpServiceGroupConfigurer.ForGroup configurer) { + this.groups.stream().filter(this.filter).forEach(group -> group.applyConfigurer(configurer)); + this.filter = this.defaultFilter; // reset the filter (terminal method) } } diff --git a/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java b/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java index b395cb2559a..e867fe902c9 100644 --- a/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/support/RestClientProxyRegistryIntegrationTests.java @@ -138,7 +138,7 @@ public class RestClientProxyRegistryIntegrationTests { @Bean public RestClientHttpServiceGroupConfigurer groupConfigurer() { return groups -> groups.filterByName("echo", "greeting") - .configureClient((group, builder) -> builder.baseUrl("http://localhost:9090")); + .forEachClient((group, builder) -> builder.baseUrl("http://localhost:9090")); } } diff --git a/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBeanTests.java b/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBeanTests.java index 694d6b83edb..775315a2ecd 100644 --- a/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBeanTests.java +++ b/spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceProxyRegistryFactoryBeanTests.java @@ -92,7 +92,7 @@ public class HttpServiceProxyRegistryFactoryBeanTests { @Override public void configureGroups(Groups groups) { filters.forEach(filter -> groups.filter(filter) - .configureClient((group, builder) -> invocations.add(filter, group.name()))); + .forEachClient((group, builder) -> invocations.add(filter, group.name()))); } } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/support/WebClientProxyRegistryIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/support/WebClientProxyRegistryIntegrationTests.java index c61155eb10a..99140cf022c 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/support/WebClientProxyRegistryIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/support/WebClientProxyRegistryIntegrationTests.java @@ -119,7 +119,7 @@ public class WebClientProxyRegistryIntegrationTests { @Bean public WebClientHttpServiceGroupConfigurer groupConfigurer() { return groups -> groups.filterByName("echo", "greeting") - .configureClient((group, builder) -> builder.baseUrl("http://localhost:9090")); + .forEachClient((group, builder) -> builder.baseUrl("http://localhost:9090")); } }