Add error handling to invalid RouteDefinition parse

- invalid definitions are logged with warn level

fixes gh-1376
fixes gh-1496
This commit is contained in:
owen.q
2019-12-20 16:47:36 +09:00
committed by Spencer Gibb
parent fd1763d5b9
commit 88be470c9b
2 changed files with 58 additions and 1 deletions

View File

@@ -144,7 +144,11 @@ public class RouteDefinitionRouteLocator
@Override
public Flux<Route> 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());

View File

@@ -81,6 +81,59 @@ public class RouteDefinitionRouteLocatorTests {
.contains("RouteDefinitionRouteLocatorTests$TestOrderedGateway");
}
@Test
public void contextLoadsWithErrorRecovery() {
List<RoutePredicateFactory> predicates = Arrays
.asList(new HostRoutePredicateFactory());
List<GatewayFilterFactory> 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<Route> routes = routeDefinitionRouteLocator.getRoutes().collectList()
.block();
List<GatewayFilter> 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<RouteDefinition> 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());