diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java index b2b33270..203fb8dc 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RetryGatewayFilterFactory.java @@ -158,7 +158,7 @@ public class RetryGatewayFilterFactory extends AbstractGatewayFilterFactory(this.gatewayProperties.getDefaultFilters()))); + loadGatewayFilters(routeDefinition.getId(), new ArrayList<>(this.gatewayProperties.getDefaultFilters()))); } if (!routeDefinition.getFilters().isEmpty()) { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java index 52956925..1720ef20 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java @@ -33,6 +33,7 @@ import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFac import org.springframework.cloud.gateway.filter.factory.AddResponseHeaderGatewayFilterFactory; import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory; import org.springframework.cloud.gateway.filter.factory.RemoveResponseHeaderGatewayFilterFactory; +import org.springframework.cloud.gateway.filter.factory.RetryGatewayFilterFactory; import org.springframework.cloud.gateway.handler.predicate.HostRoutePredicateFactory; import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; import org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory; @@ -108,6 +109,43 @@ public class RouteDefinitionRouteLocatorTests { }).expectComplete().verify(); } + @Test + public void contextLoadsAndApplyRouteIdToRetryFilter() { + List predicates = Arrays + .asList(new HostRoutePredicateFactory()); + List gatewayFilterFactories = Arrays.asList( + new RetryGatewayFilterFactory(), + new AddResponseHeaderGatewayFilterFactory()); + GatewayProperties gatewayProperties = new GatewayProperties(); + gatewayProperties.setDefaultFilters(Arrays.asList(new FilterDefinition("Retry"))); + gatewayProperties.setRoutes(Arrays.asList(new RouteDefinition() { + { + setId("foo"); + setUri(URI.create("https://foo.example.com")); + setPredicates( + Arrays.asList(new PredicateDefinition("Host=*.example.com"))); + setFilters(Arrays.asList( + new FilterDefinition("AddResponseHeader=X-Response-Foo, Bar"))); + } + })); + + PropertiesRouteDefinitionLocator routeDefinitionLocator = new PropertiesRouteDefinitionLocator( + gatewayProperties); + @SuppressWarnings("deprecation") + RouteDefinitionRouteLocator routeDefinitionRouteLocator = new RouteDefinitionRouteLocator( + new CompositeRouteDefinitionLocator(Flux.just(routeDefinitionLocator)), + predicates, gatewayFilterFactories, gatewayProperties, + new ConfigurationService()); + + StepVerifier.create(routeDefinitionRouteLocator.getRoutes()).assertNext(route -> { + List filters = route.getFilters(); + assertThat(filters).hasSize(2); + assertThat(filters.get(0).toString()).contains("routeId = 'foo'"); + assertThat(getFilterClassName(filters.get(0))).contains("Retry"); + assertThat(getFilterClassName(filters.get(1))).contains("AddResponseHeader"); + }).expectComplete().verify(); + } + private List containsInvalidRoutes() { RouteDefinition foo = new RouteDefinition(); foo.setId("foo");