diff --git a/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java b/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java index 1b6c4526f1c..7650f28df73 100644 --- a/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java +++ b/spring-web/src/main/java/org/springframework/web/server/handler/DefaultWebFilterChain.java @@ -68,14 +68,16 @@ public class DefaultWebFilterChain implements WebFilterChain { @Override public Mono filter(ServerWebExchange exchange) { - if (this.index < this.filters.size()) { - WebFilter filter = this.filters.get(this.index); - WebFilterChain chain = new DefaultWebFilterChain(this, this.index + 1); - return filter.filter(exchange, chain); - } - else { - return this.handler.handle(exchange); - } + return Mono.defer(() -> { + if (this.index < this.filters.size()) { + WebFilter filter = this.filters.get(this.index); + WebFilterChain chain = new DefaultWebFilterChain(this, this.index + 1); + return filter.filter(exchange, chain); + } + else { + return this.handler.handle(exchange); + } + }); } } diff --git a/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java b/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java index e1c2bf1ce2e..a6ad299c8df 100644 --- a/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java +++ b/spring-web/src/test/java/org/springframework/web/server/handler/FilteringWebHandlerTests.java @@ -104,7 +104,7 @@ public class FilteringWebHandlerTests { new FilteringWebHandler(targetHandler, Collections.singletonList(filter)) .handle(MockServerHttpRequest.get("/").toExchange()) - .block(Duration.ZERO); + .block(Duration.ofSeconds(5)); assertTrue(filter.invoked()); assertTrue(targetHandler.invoked()); @@ -170,7 +170,7 @@ public class FilteringWebHandlerTests { } private Mono doAsyncWork() { - return Mono.just("123"); + return Mono.delay(Duration.ofMillis(100L)).map(l -> "123"); } }