Skip to content

Commit c509457

Browse files
committed
Merge pull request #43494 from nosan
* pr/43494: Multiple WebFlux ResourceHandlerRegistrationCustomizer should be invoked Closes gh-43494
2 parents 8572d9e + 1234409 commit c509457

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

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

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.autoconfigure.web.reactive;
1818

1919
import java.time.Duration;
20+
import java.util.List;
2021

2122
import org.apache.commons.logging.Log;
2223
import org.apache.commons.logging.LogFactory;
@@ -163,22 +164,22 @@ public static class WebFluxConfig implements WebFluxConfigurer {
163164

164165
private final ObjectProvider<CodecCustomizer> codecCustomizers;
165166

166-
private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
167+
private final ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers;
167168

168169
private final ObjectProvider<ViewResolver> viewResolvers;
169170

170171
public WebFluxConfig(Environment environment, WebProperties webProperties, WebFluxProperties webFluxProperties,
171172
ListableBeanFactory beanFactory, ObjectProvider<HandlerMethodArgumentResolver> resolvers,
172173
ObjectProvider<CodecCustomizer> codecCustomizers,
173-
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizer,
174+
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers,
174175
ObjectProvider<ViewResolver> viewResolvers) {
175176
this.environment = environment;
176177
this.resourceProperties = webProperties.getResources();
177178
this.webFluxProperties = webFluxProperties;
178179
this.beanFactory = beanFactory;
179180
this.argumentResolvers = resolvers;
180181
this.codecCustomizers = codecCustomizers;
181-
this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizer.getIfAvailable();
182+
this.resourceHandlerRegistrationCustomizers = resourceHandlerRegistrationCustomizers;
182183
this.viewResolvers = viewResolvers;
183184
}
184185

@@ -210,19 +211,22 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) {
210211
logger.debug("Default resource handling disabled");
211212
return;
212213
}
214+
List<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizers = this.resourceHandlerRegistrationCustomizers
215+
.orderedStream()
216+
.toList();
213217
String webjarsPathPattern = this.webFluxProperties.getWebjarsPathPattern();
214218
if (!registry.hasMappingForPattern(webjarsPathPattern)) {
215219
ResourceHandlerRegistration registration = registry.addResourceHandler(webjarsPathPattern)
216220
.addResourceLocations("classpath:/META-INF/resources/webjars/");
217221
configureResourceCaching(registration);
218-
customizeResourceHandlerRegistration(registration);
222+
resourceHandlerRegistrationCustomizers.forEach((customizer) -> customizer.customize(registration));
219223
}
220224
String staticPathPattern = this.webFluxProperties.getStaticPathPattern();
221225
if (!registry.hasMappingForPattern(staticPathPattern)) {
222226
ResourceHandlerRegistration registration = registry.addResourceHandler(staticPathPattern)
223227
.addResourceLocations(this.resourceProperties.getStaticLocations());
224228
configureResourceCaching(registration);
225-
customizeResourceHandlerRegistration(registration);
229+
resourceHandlerRegistrationCustomizers.forEach((customizer) -> customizer.customize(registration));
226230
}
227231
}
228232

@@ -247,12 +251,6 @@ public void addFormatters(FormatterRegistry registry) {
247251
ApplicationConversionService.addBeans(registry, this.beanFactory);
248252
}
249253

250-
private void customizeResourceHandlerRegistration(ResourceHandlerRegistration registration) {
251-
if (this.resourceHandlerRegistrationCustomizer != null) {
252-
this.resourceHandlerRegistrationCustomizer.customize(registration);
253-
}
254-
}
255-
256254
}
257255

258256
/**

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import org.springframework.web.reactive.accept.RequestedContentTypeResolver;
9191
import org.springframework.web.reactive.config.BlockingExecutionConfigurer;
9292
import org.springframework.web.reactive.config.DelegatingWebFluxConfiguration;
93+
import org.springframework.web.reactive.config.ResourceHandlerRegistration;
9394
import org.springframework.web.reactive.config.WebFluxConfigurationSupport;
9495
import org.springframework.web.reactive.config.WebFluxConfigurer;
9596
import org.springframework.web.reactive.function.server.support.RouterFunctionMapping;
@@ -122,6 +123,7 @@
122123
import static org.mockito.ArgumentMatchers.any;
123124
import static org.mockito.BDDMockito.then;
124125
import static org.mockito.Mockito.mock;
126+
import static org.mockito.Mockito.times;
125127

126128
/**
127129
* Tests for {@link WebFluxAutoConfiguration}.
@@ -182,6 +184,18 @@ void shouldCustomizeCodecs() {
182184
});
183185
}
184186

187+
@Test
188+
void shouldCustomizeResources() {
189+
this.contextRunner.withUserConfiguration(ResourceHandlerRegistrationCustomizers.class).run((context) -> {
190+
ResourceHandlerRegistrationCustomizer customizer1 = context
191+
.getBean("firstResourceHandlerRegistrationCustomizer", ResourceHandlerRegistrationCustomizer.class);
192+
ResourceHandlerRegistrationCustomizer customizer2 = context
193+
.getBean("secondResourceHandlerRegistrationCustomizer", ResourceHandlerRegistrationCustomizer.class);
194+
then(customizer1).should(times(2)).customize(any(ResourceHandlerRegistration.class));
195+
then(customizer2).should(times(2)).customize(any(ResourceHandlerRegistration.class));
196+
});
197+
}
198+
185199
@Test
186200
void shouldRegisterResourceHandlerMapping() {
187201
this.contextRunner.run((context) -> {
@@ -843,6 +857,21 @@ CodecCustomizer firstCodecCustomizer() {
843857

844858
}
845859

860+
@Configuration(proxyBeanMethods = false)
861+
static class ResourceHandlerRegistrationCustomizers {
862+
863+
@Bean
864+
ResourceHandlerRegistrationCustomizer firstResourceHandlerRegistrationCustomizer() {
865+
return mock(ResourceHandlerRegistrationCustomizer.class);
866+
}
867+
868+
@Bean
869+
ResourceHandlerRegistrationCustomizer secondResourceHandlerRegistrationCustomizer() {
870+
return mock(ResourceHandlerRegistrationCustomizer.class);
871+
}
872+
873+
}
874+
846875
@Configuration(proxyBeanMethods = false)
847876
static class ViewResolvers {
848877

0 commit comments

Comments
 (0)