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; package org.springframework.boot.autoconfigure.web.reactive;
import java.time.Duration; import java.time.Duration;
import java.util.List;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -163,14 +164,14 @@ public class WebFluxAutoConfiguration {
private final ObjectProvider<CodecCustomizer> codecCustomizers; private final ObjectProvider<CodecCustomizer> codecCustomizers;
private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; private final ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers;
private final ObjectProvider<ViewResolver> viewResolvers; private final ObjectProvider<ViewResolver> viewResolvers;
public WebFluxConfig(Environment environment, WebProperties webProperties, WebFluxProperties webFluxProperties, public WebFluxConfig(Environment environment, 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> resourceHandlerRegistrationCustomizers,
ObjectProvider<ViewResolver> viewResolvers) { ObjectProvider<ViewResolver> viewResolvers) {
this.environment = environment; this.environment = environment;
this.resourceProperties = webProperties.getResources(); this.resourceProperties = webProperties.getResources();
@ -178,7 +179,7 @@ public class WebFluxAutoConfiguration {
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
this.argumentResolvers = resolvers; this.argumentResolvers = resolvers;
this.codecCustomizers = codecCustomizers; this.codecCustomizers = codecCustomizers;
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizer.getIfAvailable(); this.resourceHandlerRegistrationCustomizers = resourceHandlerRegistrationCustomizers;
this.viewResolvers = viewResolvers; this.viewResolvers = viewResolvers;
} }
@ -210,19 +211,22 @@ public class WebFluxAutoConfiguration {
logger.debug("Default resource handling disabled"); logger.debug("Default resource handling disabled");
return; return;
} }
List<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers = this.resourceHandlerRegistrationCustomizers
.orderedStream()
.toList();
String webjarsPathPattern = this.webFluxProperties.getWebjarsPathPattern(); String webjarsPathPattern = this.webFluxProperties.getWebjarsPathPattern();
if (!registry.hasMappingForPattern(webjarsPathPattern)) { if (!registry.hasMappingForPattern(webjarsPathPattern)) {
ResourceHandlerRegistration registration = registry.addResourceHandler(webjarsPathPattern) ResourceHandlerRegistration registration = registry.addResourceHandler(webjarsPathPattern)
.addResourceLocations("classpath:/META-INF/resources/webjars/"); .addResourceLocations("classpath:/META-INF/resources/webjars/");
configureResourceCaching(registration); configureResourceCaching(registration);
customizeResourceHandlerRegistration(registration); resourceHandlerRegistrationCustomizers.forEach((customizer) -> customizer.customize(registration));
} }
String staticPathPattern = this.webFluxProperties.getStaticPathPattern(); String staticPathPattern = this.webFluxProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) { if (!registry.hasMappingForPattern(staticPathPattern)) {
ResourceHandlerRegistration registration = registry.addResourceHandler(staticPathPattern) ResourceHandlerRegistration registration = registry.addResourceHandler(staticPathPattern)
.addResourceLocations(this.resourceProperties.getStaticLocations()); .addResourceLocations(this.resourceProperties.getStaticLocations());
configureResourceCaching(registration); configureResourceCaching(registration);
customizeResourceHandlerRegistration(registration); resourceHandlerRegistrationCustomizers.forEach((customizer) -> customizer.customize(registration));
} }
} }
@ -247,12 +251,6 @@ public class WebFluxAutoConfiguration {
ApplicationConversionService.addBeans(registry, this.beanFactory); 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.accept.RequestedContentTypeResolver;
import org.springframework.web.reactive.config.BlockingExecutionConfigurer; import org.springframework.web.reactive.config.BlockingExecutionConfigurer;
import org.springframework.web.reactive.config.DelegatingWebFluxConfiguration; 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.WebFluxConfigurationSupport;
import org.springframework.web.reactive.config.WebFluxConfigurer; import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.reactive.function.server.support.RouterFunctionMapping; 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.ArgumentMatchers.any;
import static org.mockito.BDDMockito.then; import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
/** /**
* Tests for {@link WebFluxAutoConfiguration}. * 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 @Test
void shouldRegisterResourceHandlerMapping() { void shouldRegisterResourceHandlerMapping() {
this.contextRunner.run((context) -> { 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) @Configuration(proxyBeanMethods = false)
static class ViewResolvers { static class ViewResolvers {