Refine HttpServiceGroupConfigurer API
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Has been cancelled Details
Deploy Docs / Dispatch docs deployment (push) Has been cancelled Details
Build and Deploy Snapshot / Verify (push) Has been cancelled Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:17], map[id:ubuntu-latest name:Linux]) (push) Has been cancelled Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:ubuntu-latest name:Linux]) (push) Has been cancelled Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:23], map[id:ubuntu-latest name:Linux]) (push) Has been cancelled Details
Update Antora UI Spring / Update on Supported Branches (6.1.x) (push) Has been cancelled Details
Update Antora UI Spring / Update on docs-build (push) Has been cancelled Details

Closes gh-34926
This commit is contained in:
rstoyanchev 2025-05-19 18:08:46 +01:00
parent 1ea8a91b85
commit 2e086bd727
5 changed files with 56 additions and 53 deletions

View File

@ -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<CB> extends Ordered {
Groups<CB> filter(Predicate<HttpServiceGroup> 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<CB> clientConfigurer);
void forEachClient(ForClient<CB> 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<HttpServiceGroup, CB> 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<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.
*/
void configure(BiConsumer<HttpServiceGroup, CB> clientConfigurer,
BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer);
/**
* Callback to configure the client for a group.
* @param <CB> the type of client builder, i.e. {@code RestClient} or {@code WebClient} builder.
*/
@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);
}
}

View File

@ -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<HttpServiceGroup, HttpServiceProxyFactory.Builder> 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 <CB> void apply(
BiConsumer<HttpServiceGroup, CB> clientConfigurer,
BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer) {
clientConfigurer.accept(this, (CB) this.clientBuilder);
this.proxyFactoryConfigurer = this.proxyFactoryConfigurer.andThen(proxyFactoryConfigurer);
public <CB> void applyConfigurer(HttpServiceGroupConfigurer.ForGroup<CB> configurer) {
configurer.configureGroup(this, (CB) this.clientBuilder, this.proxyFactoryBuilder);
}
public Map<Class<?>, Object> createProxies() {
Map<Class<?>, 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<CB> clientConfigurer) {
configureClient((group, builder) -> clientConfigurer.accept(builder));
public void forEachClient(HttpServiceGroupConfigurer.ForClient<CB> configurer) {
forEachGroup((group, clientBuilder, factoryBuilder) ->
configurer.configureClient(group, clientBuilder));
}
@Override
public void configureClient(BiConsumer<HttpServiceGroup, CB> clientConfigurer) {
configure(clientConfigurer, (group, builder) -> {});
public void forEachProxyFactory(HttpServiceGroupConfigurer.ForProxyFactory configurer) {
forEachGroup((group, clientBuilder, factoryBuilder) ->
configurer.configureProxyFactory(group, factoryBuilder));
}
@Override
public void configureProxyFactory(
BiConsumer<HttpServiceGroup, HttpServiceProxyFactory.Builder> proxyFactoryConfigurer) {
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;
public void forEachGroup(HttpServiceGroupConfigurer.ForGroup<CB> configurer) {
this.groups.stream().filter(this.filter).forEach(group -> group.applyConfigurer(configurer));
this.filter = this.defaultFilter; // reset the filter (terminal method)
}
}

View File

@ -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"));
}
}

View File

@ -92,7 +92,7 @@ public class HttpServiceProxyRegistryFactoryBeanTests {
@Override
public void configureGroups(Groups<RestClient.Builder> groups) {
filters.forEach(filter -> groups.filter(filter)
.configureClient((group, builder) -> invocations.add(filter, group.name())));
.forEachClient((group, builder) -> invocations.add(filter, group.name())));
}
}

View File

@ -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"));
}
}