From af2666df79bbd839f95f03bc4dff1490646adfb0 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 15 Jun 2020 18:03:55 +0200 Subject: [PATCH] Fix welcome page support in WebFlux Prior to this commit, the welcome page support implemented in gh-9785 would override existing index views in both annotation and functional variants. This comes from the fact that the feature was implemented as a `RouterFunction` configured in the main `RouterFunctionMapping` bean. Due to ordering issues between mappings, this would override existing application mappings in some cases. This commit ensures that the welcome page `RouterFunction` is contributed to the context in its own handler mapping, ordered after the application ones. Fixes gh-21909 --- .../web/reactive/WebFluxAutoConfiguration.java | 11 +++++++++-- .../web/reactive/WebFluxAutoConfigurationTests.java | 11 +++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java index 5ba57740a7dd..ffda8ec1c661 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java @@ -63,6 +63,7 @@ import org.springframework.web.reactive.config.WebFluxConfigurer; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.reactive.function.server.support.RouterFunctionMapping; import org.springframework.web.reactive.result.method.HandlerMethodArgumentResolver; import org.springframework.web.reactive.result.method.annotation.ArgumentResolverConfigurer; import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter; @@ -101,12 +102,18 @@ public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() { public static class WelcomePageConfiguration { @Bean - public RouterFunction welcomePageRouterFunction(ApplicationContext applicationContext, + public RouterFunctionMapping welcomePageRouterFunctionMapping(ApplicationContext applicationContext, WebFluxProperties webFluxProperties, ResourceProperties resourceProperties) { WelcomePageRouterFunctionFactory factory = new WelcomePageRouterFunctionFactory( new TemplateAvailabilityProviders(applicationContext), applicationContext, resourceProperties.getStaticLocations(), webFluxProperties.getStaticPathPattern()); - return factory.createRouterFunction(); + RouterFunction routerFunction = factory.createRouterFunction(); + if (routerFunction != null) { + RouterFunctionMapping routerFunctionMapping = new RouterFunctionMapping(routerFunction); + routerFunctionMapping.setOrder(1); + return routerFunctionMapping; + } + return null; } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java index f7b219c9608d..8324eb8f3aa4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java @@ -62,6 +62,7 @@ import org.springframework.web.reactive.accept.RequestedContentTypeResolver; import org.springframework.web.reactive.config.WebFluxConfigurationSupport; import org.springframework.web.reactive.config.WebFluxConfigurer; +import org.springframework.web.reactive.function.server.support.RouterFunctionMapping; import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping; import org.springframework.web.reactive.resource.CachingResourceResolver; import org.springframework.web.reactive.resource.CachingResourceTransformer; @@ -108,6 +109,7 @@ void shouldCreateDefaultBeans() { assertThat(context).getBeans(RequestMappingHandlerMapping.class).hasSize(1); assertThat(context).getBeans(RequestMappingHandlerAdapter.class).hasSize(1); assertThat(context).getBeans(RequestedContentTypeResolver.class).hasSize(1); + assertThat(context).getBeans(RouterFunctionMapping.class).hasSize(1); assertThat(context.getBean("resourceHandlerMapping", HandlerMapping.class)).isNotNull(); }); } @@ -440,6 +442,15 @@ void customPrinterAndParserShouldBeRegisteredAsConverters() { }); } + @Test + void welcomePageHandlerMapping() { + this.contextRunner.withPropertyValues("spring.resources.static-locations=classpath:/welcome-page/").run((context) -> { + assertThat(context).getBeans(RouterFunctionMapping.class).hasSize(2); + assertThat(context.getBean("welcomePageRouterFunctionMapping", HandlerMapping.class)).isNotNull() + .extracting("order").isEqualTo(1); + }); + } + private Map getHandlerMap(ApplicationContext context) { HandlerMapping mapping = context.getBean("resourceHandlerMapping", HandlerMapping.class); if (mapping instanceof SimpleUrlHandlerMapping) {