diff --git a/spring-cloud-gateway-server-webmvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java b/spring-cloud-gateway-server-webmvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java index 2fd2519ce7..a1e2536edf 100644 --- a/spring-cloud-gateway-server-webmvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java +++ b/spring-cloud-gateway-server-webmvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java @@ -66,6 +66,7 @@ import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.core.annotation.Order; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.core.env.MapPropertySource; @@ -105,6 +106,7 @@ public RouterFunctionHolderFactory routerFunctionHolderFactory(Environment env, } @Bean + @Order(0) public RestClientCustomizer gatewayRestClientCustomizer( ObjectProvider requestFactoryProvider) { return restClientBuilder -> { diff --git a/spring-cloud-gateway-server-webmvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java b/spring-cloud-gateway-server-webmvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java index 85c8d5af3e..123a3f4d7b 100644 --- a/spring-cloud-gateway-server-webmvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java +++ b/spring-cloud-gateway-server-webmvc/src/test/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfigurationTests.java @@ -30,6 +30,7 @@ import org.springframework.boot.http.client.autoconfigure.HttpClientAutoConfiguration; import org.springframework.boot.http.client.autoconfigure.HttpClientsProperties; import org.springframework.boot.http.client.autoconfigure.imperative.ImperativeHttpClientsProperties; +import org.springframework.boot.restclient.RestClientCustomizer; import org.springframework.boot.restclient.autoconfigure.RestClientAutoConfiguration; import org.springframework.boot.restclient.autoconfigure.RestTemplateAutoConfiguration; import org.springframework.boot.test.context.FilteredClassLoader; @@ -48,6 +49,8 @@ import org.springframework.cloud.gateway.server.mvc.predicate.PredicateAutoConfiguration; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.core.annotation.Order; import static org.assertj.core.api.Assertions.assertThat; @@ -190,10 +193,45 @@ void loadBalancerFunctionHandlerNotAddedWhenNoLoadBalancerClientOnClasspath() { .run(context -> assertThat(context).doesNotHaveBean("lbHandlerFunctionDefinition")); } + @Test + void gatewayRestClientCustomizerHasOrderAnnotation() throws NoSuchMethodException { + Order order = GatewayServerMvcAutoConfiguration.class + .getMethod("gatewayRestClientCustomizer", org.springframework.beans.factory.ObjectProvider.class) + .getAnnotation(Order.class); + assertThat(order).isNotNull(); + assertThat(order.value()).isEqualTo(0); + } + + @Test + void customRestClientCustomizerCanOverrideGatewayCustomizer() { + new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(FilterAutoConfiguration.class, PredicateAutoConfiguration.class, + HandlerFunctionAutoConfiguration.class, GatewayServerMvcAutoConfiguration.class, + HttpClientAutoConfiguration.class, RestTemplateAutoConfiguration.class, + RestClientAutoConfiguration.class, SslAutoConfiguration.class)) + .withUserConfiguration(CustomRestClientCustomizerConfig.class) + .run(context -> { + assertThat(context).hasSingleBean(GatewayServerMvcAutoConfiguration.class); + assertThat(context.getBeansOfType(RestClientCustomizer.class)).hasSize(2); + }); + } + @SpringBootConfiguration @EnableAutoConfiguration static class TestConfig { } + static class CustomRestClientCustomizerConfig { + + @Bean + @Order(1) + RestClientCustomizer customRestClientCustomizer() { + return restClientBuilder -> { + // Custom customizer that runs after gateway customizer + }; + } + + } + }