diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java index acd3f1e6..9870b257 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocator.java @@ -144,7 +144,11 @@ public class RouteDefinitionRouteLocator @Override public Flux getRoutes() { return this.routeDefinitionLocator.getRouteDefinitions().map(this::convertToRoute) - // TODO: error handling + .onErrorContinue((error, obj) -> { + if (logger.isWarnEnabled()) { + logger.warn("RouteDefinition id " + ((RouteDefinition) obj).getId() + " will be ignored. Definition has invalid configs, " + error.getMessage()); + } + }) .map(route -> { if (logger.isDebugEnabled()) { logger.debug("RouteDefinition matched: " + route.getId()); diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java index 53da140d..f21a0a83 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/route/RouteDefinitionRouteLocatorTests.java @@ -81,6 +81,59 @@ public class RouteDefinitionRouteLocatorTests { .contains("RouteDefinitionRouteLocatorTests$TestOrderedGateway"); } + @Test + public void contextLoadsWithErrorRecovery() { + List predicates = Arrays + .asList(new HostRoutePredicateFactory()); + List gatewayFilterFactories = Arrays.asList( + new RemoveResponseHeaderGatewayFilterFactory(), + new AddResponseHeaderGatewayFilterFactory(), + new TestOrderedGatewayFilterFactory()); + GatewayProperties gatewayProperties = new GatewayProperties(); + gatewayProperties.setRoutes(containsInvalidRoutes()); + + RouteDefinitionRouteLocator routeDefinitionRouteLocator = new RouteDefinitionRouteLocator( + new PropertiesRouteDefinitionLocator(gatewayProperties), predicates, + gatewayFilterFactories, gatewayProperties, + new DefaultConversionService()); + + List routes = routeDefinitionRouteLocator.getRoutes().collectList() + .block(); + List filters = routes.get(0).getFilters(); + assertThat(filters).hasSize(3); + assertThat(getFilterClassName(filters.get(0))).contains("RemoveResponseHeader"); + assertThat(getFilterClassName(filters.get(1))).contains("AddResponseHeader"); + assertThat(getFilterClassName(filters.get(2))) + .contains("RouteDefinitionRouteLocatorTests$TestOrderedGateway"); + } + + private List containsInvalidRoutes() { + return 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("RemoveResponseHeader=Server"), + new FilterDefinition("TestOrdered="), + new FilterDefinition("AddResponseHeader=X-Response-Foo, Bar"))); + } + }, + + new RouteDefinition() { + { + setId("exceptionRaised"); + setUri(URI.create("https://foo.example.com")); + setPredicates( + Arrays.asList(new PredicateDefinition("Host=*.example.com"))); + setFilters(Arrays.asList(new FilterDefinition("Generate exception"))); + } + } + ); + } + private String getFilterClassName(GatewayFilter target) { if (target instanceof OrderedGatewayFilter) { return getFilterClassName(((OrderedGatewayFilter) target).getDelegate());