Merge branch '2.5.x'

See gh-28252
This commit is contained in:
Andy Wilkinson 2021-10-18 10:37:09 +01:00
commit 3969e63ced
4 changed files with 41 additions and 16 deletions

View File

@ -17,6 +17,8 @@
package org.springframework.boot.autoconfigure.web.reactive; package org.springframework.boot.autoconfigure.web.reactive;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -51,6 +53,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.core.io.ResourceLoader;
import org.springframework.format.FormatterRegistry; import org.springframework.format.FormatterRegistry;
import org.springframework.format.support.FormattingConversionService; import org.springframework.format.support.FormattingConversionService;
import org.springframework.http.codec.ServerCodecConfigurer; import org.springframework.http.codec.ServerCodecConfigurer;
@ -153,11 +156,13 @@ public class WebFluxAutoConfiguration {
private final ObjectProvider<ViewResolver> viewResolvers; private final ObjectProvider<ViewResolver> viewResolvers;
private final ResourceLoader resourceLoader;
public WebFluxConfig(WebProperties webProperties, WebFluxProperties webFluxProperties, public WebFluxConfig(WebProperties webProperties, WebFluxProperties webFluxProperties,
ListableBeanFactory beanFactory, ObjectProvider<HandlerMethodArgumentResolver> resolvers, ListableBeanFactory beanFactory, ObjectProvider<HandlerMethodArgumentResolver> resolvers,
ObjectProvider<CodecCustomizer> codecCustomizers, ObjectProvider<CodecCustomizer> codecCustomizers,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizer, ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizer,
ObjectProvider<ViewResolver> viewResolvers) { ObjectProvider<ViewResolver> viewResolvers, ResourceLoader resourceLoader) {
this.resourceProperties = webProperties.getResources(); this.resourceProperties = webProperties.getResources();
this.webFluxProperties = webFluxProperties; this.webFluxProperties = webFluxProperties;
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
@ -165,6 +170,7 @@ public class WebFluxAutoConfiguration {
this.codecCustomizers = codecCustomizers; this.codecCustomizers = codecCustomizers;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizer.getIfAvailable(); this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizer.getIfAvailable();
this.viewResolvers = viewResolvers; this.viewResolvers = viewResolvers;
this.resourceLoader = resourceLoader;
} }
@Override @Override
@ -184,17 +190,28 @@ public class WebFluxAutoConfiguration {
return; return;
} }
if (!registry.hasMappingForPattern("/webjars/**")) { if (!registry.hasMappingForPattern("/webjars/**")) {
ResourceHandlerRegistration registration = registry.addResourceHandler("/webjars/**") String webjarsLocation = "classpath:/META-INF/resources/webjars/";
.addResourceLocations("classpath:/META-INF/resources/webjars/"); if (this.resourceLoader.getResource(webjarsLocation).exists()) {
configureResourceCaching(registration); ResourceHandlerRegistration registration = registry.addResourceHandler("/webjars/**")
customizeResourceHandlerRegistration(registration); .addResourceLocations(webjarsLocation);
configureResourceCaching(registration);
customizeResourceHandlerRegistration(registration);
}
} }
String staticPathPattern = this.webFluxProperties.getStaticPathPattern(); String staticPathPattern = this.webFluxProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) { if (!registry.hasMappingForPattern(staticPathPattern)) {
ResourceHandlerRegistration registration = registry.addResourceHandler(staticPathPattern) List<String> foundLocations = new ArrayList<>();
.addResourceLocations(this.resourceProperties.getStaticLocations()); for (String staticLocation : this.resourceProperties.getStaticLocations()) {
configureResourceCaching(registration); if (this.resourceLoader.getResource(staticLocation).exists()) {
customizeResourceHandlerRegistration(registration); foundLocations.add(staticLocation);
}
}
if (!foundLocations.isEmpty()) {
ResourceHandlerRegistration registration = registry.addResourceHandler(staticPathPattern)
.addResourceLocations(foundLocations.toArray(new String[0]));
configureResourceCaching(registration);
customizeResourceHandlerRegistration(registration);
}
} }
} }

View File

@ -204,13 +204,15 @@ public class WebMvcAutoConfiguration {
private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
private final ResourceLoader resourceLoader;
private ServletContext servletContext; private ServletContext servletContext;
public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties, public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties,
ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider, ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
ObjectProvider<DispatcherServletPath> dispatcherServletPath, ObjectProvider<DispatcherServletPath> dispatcherServletPath,
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) { ObjectProvider<ServletRegistrationBean<?>> servletRegistrations, ResourceLoader resourceLoader) {
this.resourceProperties = webProperties.getResources(); this.resourceProperties = webProperties.getResources();
this.mvcProperties = mvcProperties; this.mvcProperties = mvcProperties;
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
@ -218,6 +220,7 @@ public class WebMvcAutoConfiguration {
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable(); this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath; this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations; this.servletRegistrations = servletRegistrations;
this.resourceLoader = resourceLoader;
this.mvcProperties.checkConfiguration(); this.mvcProperties.checkConfiguration();
} }
@ -334,7 +337,11 @@ public class WebMvcAutoConfiguration {
logger.debug("Default resource handling disabled"); logger.debug("Default resource handling disabled");
return; return;
} }
addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/"); Resource webjarsLocationResource = this.resourceLoader
.getResource("classpath:/META-INF/resources/webjars/");
if (webjarsLocationResource.exists()) {
addResourceHandler(registry, "/webjars/**", webjarsLocationResource);
}
addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> { addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations()); registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (this.servletContext != null) { if (this.servletContext != null) {
@ -344,7 +351,7 @@ public class WebMvcAutoConfiguration {
}); });
} }
private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, String... locations) { private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, Resource... locations) {
addResourceHandler(registry, pattern, (registration) -> registration.addResourceLocations(locations)); addResourceHandler(registry, pattern, (registration) -> registration.addResourceLocations(locations));
} }

View File

@ -160,9 +160,10 @@ class WebFluxAutoConfigurationTests {
SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class); SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class);
assertThat(hm.getUrlMap().get("/**")).isInstanceOf(ResourceWebHandler.class); assertThat(hm.getUrlMap().get("/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/**"); ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/**");
assertThat(staticHandler).extracting("locationValues").asList().hasSize(4); assertThat(staticHandler).extracting("locationValues").asList().hasSize(2);
assertThat(staticHandler.getLocations()).hasSize(1); assertThat(staticHandler.getLocations()).hasSize(2);
assertThat(staticHandler.getLocations().get(0)).hasToString("class path resource [public/]"); assertThat(staticHandler.getLocations().get(0)).hasToString("class path resource [META-INF/resources/]");
assertThat(staticHandler.getLocations().get(1)).hasToString("class path resource [public/]");
assertThat(hm.getUrlMap().get("/webjars/**")).isInstanceOf(ResourceWebHandler.class); assertThat(hm.getUrlMap().get("/webjars/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler webjarsHandler = (ResourceWebHandler) hm.getUrlMap().get("/webjars/**"); ResourceWebHandler webjarsHandler = (ResourceWebHandler) hm.getUrlMap().get("/webjars/**");
assertThat(webjarsHandler).extracting("locationValues").asList() assertThat(webjarsHandler).extracting("locationValues").asList()
@ -176,7 +177,7 @@ class WebFluxAutoConfigurationTests {
SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class); SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class);
assertThat(hm.getUrlMap().get("/static/**")).isInstanceOf(ResourceWebHandler.class); assertThat(hm.getUrlMap().get("/static/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/static/**"); ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/static/**");
assertThat(staticHandler).extracting("locationValues").asList().hasSize(4); assertThat(staticHandler).extracting("locationValues").asList().hasSize(2);
}); });
} }