Refine HttpServiceGroupConfigurer API
Closes gh-34926
This commit is contained in:
@@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
package org.springframework.web.service.registry;
|
package org.springframework.web.service.registry;
|
||||||
|
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
@@ -66,29 +64,54 @@ public interface HttpServiceGroupConfigurer<CB> extends Ordered {
|
|||||||
Groups<CB> filter(Predicate<HttpServiceGroup> predicate);
|
Groups<CB> filter(Predicate<HttpServiceGroup> predicate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the client for the selected groups.
|
* Configure the client of each {@link #filter(Predicate) filtered} group.
|
||||||
* This is called once for each selected group.
|
|
||||||
*/
|
*/
|
||||||
void configureClient(Consumer<CB> clientConfigurer);
|
void forEachClient(ForClient<CB> configurer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Variant of {@link #configureClient(Consumer)} with access to the
|
* Configure the {@code HttpServiceProxyFactory} of each
|
||||||
* group being configured.
|
* {@link #filter(Predicate) filtered} group.
|
||||||
*/
|
*/
|
||||||
void configureClient(BiConsumer<HttpServiceGroup, CB> clientConfigurer);
|
void forEachProxyFactory(ForProxyFactory configurer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the {@link HttpServiceProxyFactory} for the selected groups.
|
* Configure the client and the {@code HttpServiceProxyFactory} of each
|
||||||
* This is called once for each selected group.
|
* {@link #filter(Predicate) filtered} group.
|
||||||
*/
|
*/
|
||||||
void configureProxyFactory(BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer);
|
void forEachGroup(ForGroup<CB> groupConfigurer);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure the client and {@link HttpServiceProxyFactory} for the selected groups.
|
/**
|
||||||
* This is called once for each selected group.
|
* Callback to configure the client for a group.
|
||||||
*/
|
* @param <CB> the type of client builder, i.e. {@code RestClient} or {@code WebClient} builder.
|
||||||
void configure(BiConsumer<HttpServiceGroup, CB> clientConfigurer,
|
*/
|
||||||
BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer);
|
@FunctionalInterface
|
||||||
|
interface ForClient<CB> {
|
||||||
|
|
||||||
|
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 <CB> the type of client builder, i.e. {@code RestClient} or {@code WebClient} builder.
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
interface ForGroup<CB> {
|
||||||
|
|
||||||
|
void configureGroup(HttpServiceGroup group,
|
||||||
|
CB clientBuilder, HttpServiceProxyFactory.Builder factoryBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,6 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -166,7 +164,7 @@ public final class HttpServiceProxyRegistryFactoryBean
|
|||||||
|
|
||||||
private final Object clientBuilder;
|
private final Object clientBuilder;
|
||||||
|
|
||||||
private BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer = (group, builder) -> {};
|
private final HttpServiceProxyFactory.Builder proxyFactoryBuilder = HttpServiceProxyFactory.builder();
|
||||||
|
|
||||||
ProxyHttpServiceGroup(HttpServiceGroup group) {
|
ProxyHttpServiceGroup(HttpServiceGroup group) {
|
||||||
this.declaredGroup = group;
|
this.declaredGroup = group;
|
||||||
@@ -196,20 +194,13 @@ public final class HttpServiceProxyRegistryFactoryBean
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <CB> void apply(
|
public <CB> void applyConfigurer(HttpServiceGroupConfigurer.ForGroup<CB> configurer) {
|
||||||
BiConsumer<HttpServiceGroup, CB> clientConfigurer,
|
configurer.configureGroup(this, (CB) this.clientBuilder, this.proxyFactoryBuilder);
|
||||||
BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer) {
|
|
||||||
|
|
||||||
clientConfigurer.accept(this, (CB) this.clientBuilder);
|
|
||||||
this.proxyFactoryConfigurer = this.proxyFactoryConfigurer.andThen(proxyFactoryConfigurer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<Class<?>, Object> createProxies() {
|
public Map<Class<?>, Object> createProxies() {
|
||||||
Map<Class<?>, Object> map = new LinkedHashMap<>(httpServiceTypes().size());
|
Map<Class<?>, Object> map = new LinkedHashMap<>(httpServiceTypes().size());
|
||||||
HttpExchangeAdapter exchangeAdapter = initExchangeAdapter();
|
HttpServiceProxyFactory factory = this.proxyFactoryBuilder.exchangeAdapter(initExchangeAdapter()).build();
|
||||||
HttpServiceProxyFactory.Builder proxyFactoryBuilder = HttpServiceProxyFactory.builderFor(exchangeAdapter);
|
|
||||||
this.proxyFactoryConfigurer.accept(this, proxyFactoryBuilder);
|
|
||||||
HttpServiceProxyFactory factory = proxyFactoryBuilder.build();
|
|
||||||
httpServiceTypes().forEach(type -> map.put(type, factory.createClient(type)));
|
httpServiceTypes().forEach(type -> map.put(type, factory.createClient(type)));
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
@@ -256,32 +247,21 @@ public final class HttpServiceProxyRegistryFactoryBean
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configureClient(Consumer<CB> clientConfigurer) {
|
public void forEachClient(HttpServiceGroupConfigurer.ForClient<CB> configurer) {
|
||||||
configureClient((group, builder) -> clientConfigurer.accept(builder));
|
forEachGroup((group, clientBuilder, factoryBuilder) ->
|
||||||
|
configurer.configureClient(group, clientBuilder));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configureClient(BiConsumer<HttpServiceGroup, CB> clientConfigurer) {
|
public void forEachProxyFactory(HttpServiceGroupConfigurer.ForProxyFactory configurer) {
|
||||||
configure(clientConfigurer, (group, builder) -> {});
|
forEachGroup((group, clientBuilder, factoryBuilder) ->
|
||||||
|
configurer.configureProxyFactory(group, factoryBuilder));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configureProxyFactory(
|
public void forEachGroup(HttpServiceGroupConfigurer.ForGroup<CB> configurer) {
|
||||||
BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer) {
|
this.groups.stream().filter(this.filter).forEach(group -> group.applyConfigurer(configurer));
|
||||||
|
this.filter = this.defaultFilter; // reset the filter (terminal method)
|
||||||
configure((group, builder) -> {}, proxyFactoryConfigurer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void configure(
|
|
||||||
BiConsumer<HttpServiceGroup, CB> clientConfigurer,
|
|
||||||
BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer) {
|
|
||||||
|
|
||||||
this.groups.stream().filter(this.filter)
|
|
||||||
.forEach(group -> group.apply(clientConfigurer, proxyFactoryConfigurer));
|
|
||||||
|
|
||||||
// Reset filter
|
|
||||||
this.filter = this.defaultFilter;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ public class RestClientProxyRegistryIntegrationTests {
|
|||||||
@Bean
|
@Bean
|
||||||
public RestClientHttpServiceGroupConfigurer groupConfigurer() {
|
public RestClientHttpServiceGroupConfigurer groupConfigurer() {
|
||||||
return groups -> groups.filterByName("echo", "greeting")
|
return groups -> groups.filterByName("echo", "greeting")
|
||||||
.configureClient((group, builder) -> builder.baseUrl("http://localhost:9090"));
|
.forEachClient((group, builder) -> builder.baseUrl("http://localhost:9090"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public class HttpServiceProxyRegistryFactoryBeanTests {
|
|||||||
@Override
|
@Override
|
||||||
public void configureGroups(Groups<RestClient.Builder> groups) {
|
public void configureGroups(Groups<RestClient.Builder> groups) {
|
||||||
filters.forEach(filter -> groups.filter(filter)
|
filters.forEach(filter -> groups.filter(filter)
|
||||||
.configureClient((group, builder) -> invocations.add(filter, group.name())));
|
.forEachClient((group, builder) -> invocations.add(filter, group.name())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ public class WebClientProxyRegistryIntegrationTests {
|
|||||||
@Bean
|
@Bean
|
||||||
public WebClientHttpServiceGroupConfigurer groupConfigurer() {
|
public WebClientHttpServiceGroupConfigurer groupConfigurer() {
|
||||||
return groups -> groups.filterByName("echo", "greeting")
|
return groups -> groups.filterByName("echo", "greeting")
|
||||||
.configureClient((group, builder) -> builder.baseUrl("http://localhost:9090"));
|
.forEachClient((group, builder) -> builder.baseUrl("http://localhost:9090"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user