From c37c59f5784994f4c59aa2efb3059e45dc218f51 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 23 Jun 2017 07:12:10 -0400 Subject: [PATCH] Consumer methods for WebHttpHandlerBuilder Replace the more limited List-based methods to add filtes and exception handlers with Consumer> variants. --- .../server/AbstractMockServerSpec.java | 17 +++--- .../server/DefaultMockServerSpec.java | 2 + .../server/adapter/WebHttpHandlerBuilder.java | 54 ++++++------------- .../adapter/WebHttpHandlerBuilderTests.java | 4 +- .../handler/FilteringWebHandlerTests.java | 4 +- .../function/server/RouterFunctions.java | 4 +- ...mpleUrlHandlerMappingIntegrationTests.java | 2 +- 7 files changed, 32 insertions(+), 55 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java index 4f548178ecc..ffe95a5d33d 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java @@ -51,23 +51,20 @@ abstract class AbstractMockServerSpec> @Override public WebTestClient.Builder configureClient() { WebHttpHandlerBuilder builder = initHttpHandlerBuilder(); - filtersInReverse().forEach(builder::prependFilter); + builder.filters(currentFilters -> { + List toPrepend = new ArrayList<>(this.filters); + Collections.reverse(toPrepend); + toPrepend.forEach(filter -> currentFilters.add(0, filter)); + }); return new DefaultWebTestClientBuilder(builder.build()); } /** - * Sub-classes to create the {@code WebHttpHandlerBuilder} to use. + * Sub-classes must create an {@code WebHttpHandlerBuilder} that will then + * be used to create the HttpHandler for the mock server. */ protected abstract WebHttpHandlerBuilder initHttpHandlerBuilder(); - /** - * Return the filters in reverse order for pre-pending. - */ - private List filtersInReverse() { - List result = new ArrayList<>(this.filters); - Collections.reverse(result); - return result; - } @Override public WebTestClient build() { diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultMockServerSpec.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultMockServerSpec.java index 83a6a813a5d..11a0e033cb7 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultMockServerSpec.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultMockServerSpec.java @@ -20,6 +20,8 @@ import org.springframework.web.server.WebHandler; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; /** + * Simple extension of {@link AbstractMockServerSpec} that is given a target + * {@link WebHandler}. * * @author Rossen Stoyanchev * @since 5.0 diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java b/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java index 273fe33cf67..5b1c680528f 100644 --- a/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java @@ -17,7 +17,9 @@ package org.springframework.web.server.adapter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.function.Consumer; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; @@ -133,8 +135,8 @@ public class WebHttpHandlerBuilder { SortedBeanContainer container = new SortedBeanContainer(); context.getAutowireCapableBeanFactory().autowireBean(container); - builder.filters(container.getFilters()); - builder.exceptionHandlers(container.getExceptionHandlers()); + builder.filters(filters -> filters.addAll(container.getFilters())); + builder.exceptionHandlers(handlers -> handlers.addAll(container.getExceptionHandlers())); try { builder.sessionManager( @@ -166,8 +168,8 @@ public class WebHttpHandlerBuilder { /** * Add the given filter(s). - * @param filters the filter(s) to add -that's */ + * @param filters the filter(s) to add that's + */ public WebHttpHandlerBuilder filter(WebFilter... filters) { if (!ObjectUtils.isEmpty(filters)) { this.filters.addAll(Arrays.asList(filters)); @@ -176,23 +178,11 @@ that's */ } /** - * Add the given filters. - * @param filters the filters to add + * Manipulate the "live" list of currently configured filters. + * @param consumer the consumer to use */ - public WebHttpHandlerBuilder filters(List filters) { - if (!ObjectUtils.isEmpty(filters)) { - this.filters.addAll(filters); - } - return this; - } - - /** - * Insert the given filter before other configured filters. - * @param filter the filters to insert - */ - public WebHttpHandlerBuilder prependFilter(WebFilter filter) { - Assert.notNull(filter, "WebFilter is required"); - this.filters.add(0, filter); + public WebHttpHandlerBuilder filters(Consumer> consumer) { + consumer.accept(this.filters); return this; } @@ -208,23 +198,11 @@ that's */ } /** - * Add the given exception handlers. - * @param handlers the exception handlers + * Manipulate the "live" list of currently configured exception handlers. + * @param consumer the consumer to use */ - public WebHttpHandlerBuilder exceptionHandlers(List handlers) { - if (!ObjectUtils.isEmpty(handlers)) { - this.exceptionHandlers.addAll(handlers); - } - return this; - } - - /** - * Insert the given exception handler before other configured handlers. - * @param handler the exception handler to insert - */ - public WebHttpHandlerBuilder prependExceptionHandler(WebExceptionHandler handler) { - Assert.notNull(handler, "WebExceptionHandler is required"); - this.exceptionHandlers.add(0, handler); + public WebHttpHandlerBuilder exceptionHandlers(Consumer> consumer) { + consumer.accept(this.exceptionHandlers); return this; } @@ -288,9 +266,9 @@ that's */ private static class SortedBeanContainer { - private List filters; + private List filters = Collections.emptyList(); - private List exceptionHandlers; + private List exceptionHandlers = Collections.emptyList(); @Autowired(required = false) diff --git a/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java b/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java index 5ef26eb4fbc..7c1be738e48 100644 --- a/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java @@ -36,8 +36,8 @@ import org.springframework.web.server.WebExceptionHandler; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebHandler; -import static java.time.Duration.*; -import static org.junit.Assert.*; +import static java.time.Duration.ofMillis; +import static org.junit.Assert.assertEquals; /** * Unit tests for {@link WebHttpHandlerBuilder}. 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 a6ad299c8df..5fbbf2887d0 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 @@ -119,8 +119,8 @@ public class FilteringWebHandlerTests { TestExceptionHandler exceptionHandler = new TestExceptionHandler(); WebHttpHandlerBuilder.webHandler(new StubWebHandler()) - .filters(Collections.singletonList(new ExceptionFilter())) - .exceptionHandlers(Collections.singletonList(exceptionHandler)).build() + .filter(new ExceptionFilter()) + .exceptionHandler(exceptionHandler).build() .handle(request, response) .block(); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RouterFunctions.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RouterFunctions.java index 4d5bb6788b6..141c3a4a3b4 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RouterFunctions.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RouterFunctions.java @@ -197,8 +197,8 @@ public abstract class RouterFunctions { WebHandler webHandler = toWebHandler(routerFunction, strategies); return WebHttpHandlerBuilder.webHandler(webHandler) - .filters(strategies.webFilters()) - .exceptionHandlers(strategies.exceptionHandlers()) + .filters(filters -> filters.addAll(strategies.webFilters())) + .exceptionHandlers(handlers -> handlers.addAll(strategies.exceptionHandlers())) .localeContextResolver(strategies.localeContextResolver()) .build(); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java index a71ba5f5ca8..0e1023ac2df 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/SimpleUrlHandlerMappingIntegrationTests.java @@ -63,7 +63,7 @@ public class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandler wac.refresh(); return WebHttpHandlerBuilder.webHandler(new DispatcherHandler(wac)) - .exceptionHandlers(Collections.singletonList(new ResponseStatusExceptionHandler())) + .exceptionHandler(new ResponseStatusExceptionHandler()) .build(); }