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:
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user