Merge branch '3.3.x'

Closes gh-43497
This commit is contained in:
Moritz Halbritter 2024-12-13 14:17:47 +01:00
commit 8c20e6c1e9
2 changed files with 38 additions and 11 deletions

View File

@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.web.reactive;
import java.time.Duration;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -163,14 +164,14 @@ public class WebFluxAutoConfiguration {
private final ObjectProvider<CodecCustomizer> codecCustomizers;
private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
private final ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers;
private final ObjectProvider<ViewResolver> viewResolvers;
public WebFluxConfig(Environment environment, WebProperties webProperties, WebFluxProperties webFluxProperties,
ListableBeanFactory beanFactory, ObjectProvider<HandlerMethodArgumentResolver> resolvers,
ObjectProvider<CodecCustomizer> codecCustomizers,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizer,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers,
ObjectProvider<ViewResolver> viewResolvers) {
this.environment = environment;
this.resourceProperties = webProperties.getResources();
@ -178,7 +179,7 @@ public class WebFluxAutoConfiguration {
this.beanFactory = beanFactory;
this.argumentResolvers = resolvers;
this.codecCustomizers = codecCustomizers;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizer.getIfAvailable();
this.resourceHandlerRegistrationCustomizers = resourceHandlerRegistrationCustomizers;
this.viewResolvers = viewResolvers;
}
@ -210,19 +211,22 @@ public class WebFluxAutoConfiguration {
logger.debug("Default resource handling disabled");
return;
}
List<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers = this.resourceHandlerRegistrationCustomizers
.orderedStream()
.toList();
String webjarsPathPattern = this.webFluxProperties.getWebjarsPathPattern();
if (!registry.hasMappingForPattern(webjarsPathPattern)) {
ResourceHandlerRegistration registration = registry.addResourceHandler(webjarsPathPattern)
.addResourceLocations("classpath:/META-INF/resources/webjars/");
configureResourceCaching(registration);
customizeResourceHandlerRegistration(registration);
resourceHandlerRegistrationCustomizers.forEach((customizer) -> customizer.customize(registration));
}
String staticPathPattern = this.webFluxProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
ResourceHandlerRegistration registration = registry.addResourceHandler(staticPathPattern)
.addResourceLocations(this.resourceProperties.getStaticLocations());
configureResourceCaching(registration);
customizeResourceHandlerRegistration(registration);
resourceHandlerRegistrationCustomizers.forEach((customizer) -> customizer.customize(registration));
}
}
@ -247,12 +251,6 @@ public class WebFluxAutoConfiguration {
ApplicationConversionService.addBeans(registry, this.beanFactory);
}
private void customizeResourceHandlerRegistration(ResourceHandlerRegistration registration) {
if (this.resourceHandlerRegistrationCustomizer != null) {
this.resourceHandlerRegistrationCustomizer.customize(registration);
}
}
}
/**

View File

@ -90,6 +90,7 @@ import org.springframework.web.reactive.HandlerMapping;
import org.springframework.web.reactive.accept.RequestedContentTypeResolver;
import org.springframework.web.reactive.config.BlockingExecutionConfigurer;
import org.springframework.web.reactive.config.DelegatingWebFluxConfiguration;
import org.springframework.web.reactive.config.ResourceHandlerRegistration;
import org.springframework.web.reactive.config.WebFluxConfigurationSupport;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.reactive.function.server.support.RouterFunctionMapping;
@ -122,6 +123,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
/**
* Tests for {@link WebFluxAutoConfiguration}.
@ -182,6 +184,18 @@ class WebFluxAutoConfigurationTests {
});
}
@Test
void shouldCustomizeResources() {
this.contextRunner.withUserConfiguration(ResourceHandlerRegistrationCustomizers.class).run((context) -> {
ResourceHandlerRegistrationCustomizer customizer1 = context
.getBean("firstResourceHandlerRegistrationCustomizer", ResourceHandlerRegistrationCustomizer.class);
ResourceHandlerRegistrationCustomizer customizer2 = context
.getBean("secondResourceHandlerRegistrationCustomizer", ResourceHandlerRegistrationCustomizer.class);
then(customizer1).should(times(2)).customize(any(ResourceHandlerRegistration.class));
then(customizer2).should(times(2)).customize(any(ResourceHandlerRegistration.class));
});
}
@Test
void shouldRegisterResourceHandlerMapping() {
this.contextRunner.run((context) -> {
@ -845,6 +859,21 @@ class WebFluxAutoConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
static class ResourceHandlerRegistrationCustomizers {
@Bean
ResourceHandlerRegistrationCustomizer firstResourceHandlerRegistrationCustomizer() {
return mock(ResourceHandlerRegistrationCustomizer.class);
}
@Bean
ResourceHandlerRegistrationCustomizer secondResourceHandlerRegistrationCustomizer() {
return mock(ResourceHandlerRegistrationCustomizer.class);
}
}
@Configuration(proxyBeanMethods = false)
static class ViewResolvers {