Skip to content

Commit 3e6a997

Browse files
CheHyeonYeongclaude
andcommitted
Add @order annotation to gatewayRestClientCustomizer bean
This allows users to add custom RestClientCustomizer beans that can override the requestFactory by running after the gateway customizer. Closes #3626 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: CheHyeonYeong <gusdudco6@naver.com>
1 parent beaa38b commit 3e6a997

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

spring-cloud-gateway-server-webmvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.springframework.context.annotation.Conditional;
6767
import org.springframework.context.annotation.Configuration;
6868
import org.springframework.context.annotation.Import;
69+
import org.springframework.core.annotation.Order;
6970
import org.springframework.core.env.ConfigurableEnvironment;
7071
import org.springframework.core.env.Environment;
7172
import org.springframework.core.env.MapPropertySource;
@@ -105,6 +106,7 @@ public RouterFunctionHolderFactory routerFunctionHolderFactory(Environment env,
105106
}
106107

107108
@Bean
109+
@Order(0)
108110
public RestClientCustomizer gatewayRestClientCustomizer(
109111
ObjectProvider<ClientHttpRequestFactory> requestFactoryProvider) {
110112
return restClientBuilder -> {

spring-cloud-gateway-server-webmvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.boot.http.client.autoconfigure.HttpClientAutoConfiguration;
3131
import org.springframework.boot.http.client.autoconfigure.HttpClientsProperties;
3232
import org.springframework.boot.http.client.autoconfigure.imperative.ImperativeHttpClientsProperties;
33+
import org.springframework.boot.restclient.RestClientCustomizer;
3334
import org.springframework.boot.restclient.autoconfigure.RestClientAutoConfiguration;
3435
import org.springframework.boot.restclient.autoconfigure.RestTemplateAutoConfiguration;
3536
import org.springframework.boot.test.context.FilteredClassLoader;
@@ -48,6 +49,8 @@
4849
import org.springframework.cloud.gateway.server.mvc.predicate.PredicateAutoConfiguration;
4950
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
5051
import org.springframework.context.ConfigurableApplicationContext;
52+
import org.springframework.context.annotation.Bean;
53+
import org.springframework.core.annotation.Order;
5154

5255
import static org.assertj.core.api.Assertions.assertThat;
5356

@@ -190,10 +193,45 @@ void loadBalancerFunctionHandlerNotAddedWhenNoLoadBalancerClientOnClasspath() {
190193
.run(context -> assertThat(context).doesNotHaveBean("lbHandlerFunctionDefinition"));
191194
}
192195

196+
@Test
197+
void gatewayRestClientCustomizerHasOrderAnnotation() throws NoSuchMethodException {
198+
Order order = GatewayServerMvcAutoConfiguration.class
199+
.getMethod("gatewayRestClientCustomizer", org.springframework.beans.factory.ObjectProvider.class)
200+
.getAnnotation(Order.class);
201+
assertThat(order).isNotNull();
202+
assertThat(order.value()).isEqualTo(0);
203+
}
204+
205+
@Test
206+
void customRestClientCustomizerCanOverrideGatewayCustomizer() {
207+
new ApplicationContextRunner()
208+
.withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class,
209+
HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class,
210+
HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class,
211+
RestClientAutoConfiguration.class, SslAutoConfiguration.class))
212+
.withUserConfiguration(CustomRestClientCustomizerConfig.class)
213+
.run(context -> {
214+
assertThat(context).hasSingleBean(GatewayServerMvcAutoConfiguration.class);
215+
assertThat(context.getBeansOfType(RestClientCustomizer.class)).hasSize(2);
216+
});
217+
}
218+
193219
@SpringBootConfiguration
194220
@EnableAutoConfiguration
195221
static class TestConfig {
196222

197223
}
198224

225+
static class CustomRestClientCustomizerConfig {
226+
227+
@Bean
228+
@Order(1)
229+
RestClientCustomizer customRestClientCustomizer() {
230+
return restClientBuilder -> {
231+
// Custom customizer that runs after gateway customizer
232+
};
233+
}
234+
235+
}
236+
199237
}

0 commit comments

Comments
 (0)