Browse Source

Multiple WebFlux ResourceHandlerRegistrationCustomizer should be invoked

Before this commit, only a single ResourceHandlerRegistrationCustomizer
was invoked. This commit adds functionality to have more
than one ResourceHandlerRegistrationCustomizers

See gh-43494
pull/43904/head
Dmytro Nosan 1 year ago committed by Moritz Halbritter
parent
commit
1234409fbe
  1. 20
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java
  2. 29
      spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java

20
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java

@ -17,6 +17,7 @@ @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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);
}
}
}
/**

29
spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfigurationTests.java

@ -90,6 +90,7 @@ import org.springframework.web.reactive.HandlerMapping; @@ -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; @@ -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 { @@ -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) -> {
@ -843,6 +857,21 @@ class WebFluxAutoConfigurationTests { @@ -843,6 +857,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 {

Loading…
Cancel
Save