Merge branch '2.4.x' into 2.5.x

See gh-28241
pull/28778/head
Andy Wilkinson 3 years ago
commit 196013fc39

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

@ -201,6 +201,8 @@ public class WebMvcAutoConfiguration {
private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
private final ResourceLoader resourceLoader;
private ServletContext servletContext;
public WebMvcAutoConfigurationAdapter(
@ -209,7 +211,7 @@ public class WebMvcAutoConfiguration {
ObjectProvider<HttpMessageConverters> messageConvertersProvider,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
ObjectProvider<DispatcherServletPath> dispatcherServletPath,
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
ObjectProvider<ServletRegistrationBean<?>> servletRegistrations, ResourceLoader resourceLoader) {
this.resourceProperties = resourceProperties.hasBeenCustomized() ? resourceProperties
: webProperties.getResources();
this.mvcProperties = mvcProperties;
@ -218,6 +220,7 @@ public class WebMvcAutoConfiguration {
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations;
this.resourceLoader = resourceLoader;
this.mvcProperties.checkConfiguration();
}
@ -334,7 +337,11 @@ public class WebMvcAutoConfiguration {
logger.debug("Default resource handling disabled");
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) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
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));
}

@ -157,9 +157,10 @@ class WebFluxAutoConfigurationTests {
SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class);
assertThat(hm.getUrlMap().get("/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/**");
assertThat(staticHandler).extracting("locationValues").asList().hasSize(4);
assertThat(staticHandler.getLocations()).hasSize(1);
assertThat(staticHandler.getLocations().get(0)).hasToString("class path resource [public/]");
assertThat(staticHandler).extracting("locationValues").asList().hasSize(2);
assertThat(staticHandler.getLocations()).hasSize(2);
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);
ResourceWebHandler webjarsHandler = (ResourceWebHandler) hm.getUrlMap().get("/webjars/**");
assertThat(webjarsHandler).extracting("locationValues").asList()
@ -173,7 +174,7 @@ class WebFluxAutoConfigurationTests {
SimpleUrlHandlerMapping hm = context.getBean("resourceHandlerMapping", SimpleUrlHandlerMapping.class);
assertThat(hm.getUrlMap().get("/static/**")).isInstanceOf(ResourceWebHandler.class);
ResourceWebHandler staticHandler = (ResourceWebHandler) hm.getUrlMap().get("/static/**");
assertThat(staticHandler).extracting("locationValues").asList().hasSize(4);
assertThat(staticHandler).extracting("locationValues").asList().hasSize(2);
});
}

Loading…
Cancel
Save