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
				
			
		
	
				
					
				
			
				
	
				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:
		
							parent
							
								
									1ea8a91b85
								
							
						
					
					
						commit
						2e086bd727
					
				|  | @ -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")); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue