diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java index 3e818321..3e4c3ddf 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMapping.java @@ -126,17 +126,16 @@ public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { protected Mono lookupRoute(ServerWebExchange exchange) { return this.routeLocator.getRoutes() - // individually filter routes so that filterWhen error delaying is not a - // problem - .concatMap(route -> Mono.just(route).filterWhen(r -> { + .filterWhen(route -> { // add the current route we are testing - exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, r.getId()); - return r.getPredicate().apply(exchange); + exchange.getAttributes().put(GATEWAY_PREDICATE_ROUTE_ATTR, route.getId()); + try { + return route.getPredicate().apply(exchange); + } catch (Exception e) { + logger.error("Error applying predicate for route: " + route.getId(), e); + } + return Mono.just(false); }) - // instead of immediately stopping main flux due to error, log and - // swallow it - .doOnError(e -> logger.error("Error applying predicate for route: " + route.getId(), e)) - .onErrorResume(e -> Mono.empty())) // .defaultIfEmpty() put a static Route not found // or .switchIfEmpty() // .switchIfEmpty(Mono.empty().log("noroute")) diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java index 151e3c26..d8071604 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/RoutePredicateHandlerMappingTests.java @@ -66,7 +66,7 @@ public class RoutePredicateHandlerMappingTests { Route routeFalse = Route.async().id("routeFalse").uri("http://localhost") .asyncPredicate(swe -> Mono.just(false)).build(); Route routeError = Route.async().id("routeError").uri("http://localhost") - .asyncPredicate(swe -> Mono.error(new IllegalStateException("boom1"))).build(); + .asyncPredicate(swe -> Mono.just(test())).build(); Route routeFail = Route.async().id("routeFail").uri("http://localhost").asyncPredicate(swe -> { throw new IllegalStateException("boom2"); }).build(); @@ -87,4 +87,8 @@ public class RoutePredicateHandlerMappingTests { Assertions.assertTrue(capturedOutput.getOut().contains("java.lang.IllegalStateException: boom2")); } + boolean test() { + throw new IllegalStateException("boom1"); + } + }