Skip to content

Commit 99a3ec8

Browse files
committed
Merge branch '1.5.x'
2 parents 3526d4d + 5f3d5fb commit 99a3ec8

File tree

4 files changed

+61
-78
lines changed

4 files changed

+61
-78
lines changed

spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/AbstractEndpointHandlerMapping.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import javax.servlet.http.HttpServletResponse;
3030

3131
import org.springframework.boot.actuate.endpoint.Endpoint;
32-
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
3332
import org.springframework.context.ApplicationContext;
3433
import org.springframework.util.Assert;
3534
import org.springframework.util.ObjectUtils;
@@ -295,12 +294,13 @@ protected CorsConfiguration initCorsConfiguration(Object handler, Method method,
295294
private static final class SkipPathExtensionContentNegotiation
296295
extends HandlerInterceptorAdapter {
297296

297+
private static final String SKIP_ATTRIBUTE = PathExtensionContentNegotiationStrategy.class
298+
.getName() + ".SKIP";
299+
298300
@Override
299301
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
300302
Object handler) throws Exception {
301-
request.setAttribute(
302-
WebMvcAutoConfiguration.SKIP_PATH_EXTENSION_CONTENT_NEGOTIATION_ATTRIBUTE,
303-
Boolean.TRUE);
303+
request.setAttribute(SKIP_ATTRIBUTE, Boolean.TRUE);
304304
return true;
305305
}
306306

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

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,15 @@
2424
import org.apache.commons.logging.LogFactory;
2525

2626
import org.springframework.beans.BeansException;
27+
import org.springframework.beans.factory.BeanFactory;
28+
import org.springframework.beans.factory.BeanFactoryAware;
2729
import org.springframework.beans.factory.BeanFactoryUtils;
2830
import org.springframework.beans.factory.DisposableBean;
2931
import org.springframework.beans.factory.InitializingBean;
3032
import org.springframework.beans.factory.ListableBeanFactory;
3133
import org.springframework.beans.factory.ObjectProvider;
3234
import org.springframework.beans.factory.annotation.Autowired;
33-
import org.springframework.beans.factory.config.BeanDefinition;
34-
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
35-
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3635
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
37-
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
3836
import org.springframework.beans.factory.support.RootBeanDefinition;
3937
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
4038
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
@@ -54,13 +52,13 @@
5452
import org.springframework.context.annotation.Configuration;
5553
import org.springframework.context.annotation.ConfigurationCondition;
5654
import org.springframework.context.annotation.Import;
57-
import org.springframework.context.annotation.Role;
55+
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
5856
import org.springframework.core.Ordered;
5957
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
60-
import org.springframework.core.annotation.Order;
6158
import org.springframework.core.convert.converter.Converter;
6259
import org.springframework.core.convert.converter.GenericConverter;
6360
import org.springframework.core.type.AnnotatedTypeMetadata;
61+
import org.springframework.core.type.AnnotationMetadata;
6462
import org.springframework.format.Formatter;
6563
import org.springframework.format.FormatterRegistry;
6664
import org.springframework.http.CacheControl;
@@ -92,6 +90,7 @@
9290
* @author Rob Winch
9391
* @author Stephane Nicoll
9492
* @author Andy Wilkinson
93+
* @author Phillip Webb
9594
* @since 2.0.0
9695
*/
9796
@Configuration
@@ -102,15 +101,9 @@
102101
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
103102
public class WebFluxAnnotationAutoConfiguration {
104103

105-
@Bean
106-
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
107-
public static WebFluxValidatorPostProcessor mvcValidatorAliasPostProcessor() {
108-
return new WebFluxValidatorPostProcessor();
109-
}
110-
111104
@Configuration
112105
@EnableConfigurationProperties({ ResourceProperties.class, WebFluxProperties.class })
113-
@Import(EnableWebFluxConfiguration.class)
106+
@Import({ EnableWebFluxConfiguration.class, WebFluxValidatorRegistrar.class })
114107
public static class WebFluxConfig implements WebFluxConfigurer {
115108

116109
private static final Log logger = LogFactory.getLog(WebFluxConfig.class);
@@ -306,8 +299,8 @@ private ResourceResolver getVersionResourceResolver(
306299

307300
/**
308301
* Condition used to disable the default WebFlux validator registration. The
309-
* {@link WebFluxValidatorPostProcessor} is used to configure the
310-
* {@code webFluxValidator} bean.
302+
* {@link WebFluxValidatorRegistrar} is used to register the {@code webFluxValidator}
303+
* bean.
311304
*/
312305
static class DisableWebFluxValidatorCondition implements ConfigurationCondition {
313306

@@ -324,53 +317,55 @@ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
324317
}
325318

326319
/**
327-
* {@link BeanFactoryPostProcessor} to deal with the MVC validator bean registration.
328-
* Applies the following rules:
320+
* {@link ImportBeanDefinitionRegistrar} to deal with the WebFlux validator bean
321+
* registration. Applies the following rules:
329322
* <ul>
330323
* <li>With no validators - Uses standard
331324
* {@link WebFluxConfigurationSupport#webFluxValidator()} logic.</li>
332325
* <li>With a single validator - Uses an alias.</li>
333-
* <li>With multiple validators - Registers a mvcValidator bean if not already
326+
* <li>With multiple validators - Registers a webFluxValidator bean if not already
334327
* defined.</li>
335328
* </ul>
336329
*/
337-
@Order(Ordered.LOWEST_PRECEDENCE)
338-
static class WebFluxValidatorPostProcessor
339-
implements BeanDefinitionRegistryPostProcessor {
330+
static class WebFluxValidatorRegistrar
331+
implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
340332

341333
private static final String JSR303_VALIDATOR_CLASS = "javax.validation.Validator";
342334

335+
private BeanFactory beanFactory;
336+
343337
@Override
344-
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
345-
throws BeansException {
346-
if (registry instanceof ListableBeanFactory) {
347-
postProcess(registry, (ListableBeanFactory) registry);
348-
}
338+
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
339+
this.beanFactory = beanFactory;
349340
}
350341

351342
@Override
352-
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
353-
throws BeansException {
343+
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
344+
BeanDefinitionRegistry registry) {
345+
if (this.beanFactory instanceof ListableBeanFactory) {
346+
registerOrAliasWebFluxValidator(registry,
347+
(ListableBeanFactory) this.beanFactory);
348+
}
354349
}
355350

356-
private void postProcess(BeanDefinitionRegistry registry,
351+
private void registerOrAliasWebFluxValidator(BeanDefinitionRegistry registry,
357352
ListableBeanFactory beanFactory) {
358353
String[] validatorBeans = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
359354
beanFactory, Validator.class, false, false);
360355
if (validatorBeans.length == 0) {
361-
registerMvcValidator(registry, beanFactory);
356+
registerNewWebFluxValidator(registry, beanFactory);
362357
}
363358
else if (validatorBeans.length == 1) {
364359
registry.registerAlias(validatorBeans[0], "webFluxValidator");
365360
}
366361
else {
367362
if (!ObjectUtils.containsElement(validatorBeans, "webFluxValidator")) {
368-
registerMvcValidator(registry, beanFactory);
363+
registerNewWebFluxValidator(registry, beanFactory);
369364
}
370365
}
371366
}
372367

373-
private void registerMvcValidator(BeanDefinitionRegistry registry,
368+
private void registerNewWebFluxValidator(BeanDefinitionRegistry registry,
374369
ListableBeanFactory beanFactory) {
375370
RootBeanDefinition definition = new RootBeanDefinition();
376371
definition.setBeanClass(getClass());

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.java

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,15 @@
3232

3333
import org.springframework.beans.BeansException;
3434
import org.springframework.beans.factory.BeanFactory;
35+
import org.springframework.beans.factory.BeanFactoryAware;
3536
import org.springframework.beans.factory.BeanFactoryUtils;
3637
import org.springframework.beans.factory.DisposableBean;
3738
import org.springframework.beans.factory.InitializingBean;
3839
import org.springframework.beans.factory.ListableBeanFactory;
3940
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
4041
import org.springframework.beans.factory.ObjectProvider;
4142
import org.springframework.beans.factory.annotation.Autowired;
42-
import org.springframework.beans.factory.config.BeanDefinition;
43-
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
44-
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
4543
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
46-
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
4744
import org.springframework.beans.factory.support.RootBeanDefinition;
4845
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
4946
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
@@ -72,14 +69,14 @@
7269
import org.springframework.context.annotation.Configuration;
7370
import org.springframework.context.annotation.ConfigurationCondition;
7471
import org.springframework.context.annotation.Import;
72+
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
7573
import org.springframework.context.annotation.Primary;
76-
import org.springframework.context.annotation.Role;
7774
import org.springframework.core.Ordered;
78-
import org.springframework.core.annotation.Order;
7975
import org.springframework.core.convert.converter.Converter;
8076
import org.springframework.core.convert.converter.GenericConverter;
8177
import org.springframework.core.io.Resource;
8278
import org.springframework.core.type.AnnotatedTypeMetadata;
79+
import org.springframework.core.type.AnnotationMetadata;
8380
import org.springframework.format.Formatter;
8481
import org.springframework.format.FormatterRegistry;
8582
import org.springframework.format.datetime.DateFormatter;
@@ -160,19 +157,6 @@ public class WebMvcAutoConfiguration {
160157

161158
public static final String DEFAULT_SUFFIX = "";
162159

163-
/**
164-
* Attribute that can be added to the web request when the
165-
* {@link PathExtensionContentNegotiationStrategy} should be be skipped.
166-
*/
167-
public static final String SKIP_PATH_EXTENSION_CONTENT_NEGOTIATION_ATTRIBUTE = PathExtensionContentNegotiationStrategy.class
168-
.getName() + ".SKIP";
169-
170-
@Bean
171-
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
172-
public static MvcValidatorPostProcessor mvcValidatorAliasPostProcessor() {
173-
return new MvcValidatorPostProcessor();
174-
}
175-
176160
@Bean
177161
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
178162
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
@@ -189,7 +173,7 @@ public OrderedHttpPutFormContentFilter httpPutFormContentFilter() {
189173
// Defined as a nested config to ensure WebMvcConfigurerAdapter is not read when not
190174
// on the classpath
191175
@Configuration
192-
@Import(EnableWebMvcConfiguration.class)
176+
@Import({ EnableWebMvcConfiguration.class, MvcValidatorRegistrar.class })
193177
@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
194178
public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {
195179

@@ -623,6 +607,9 @@ private List<MediaType> getAcceptedMediaTypes(HttpServletRequest request) {
623607
static class OptionalPathExtensionContentNegotiationStrategy
624608
implements ContentNegotiationStrategy {
625609

610+
private static final String SKIP_ATTRIBUTE = PathExtensionContentNegotiationStrategy.class
611+
.getName() + ".SKIP";
612+
626613
private final ContentNegotiationStrategy delegate;
627614

628615
OptionalPathExtensionContentNegotiationStrategy(
@@ -633,8 +620,7 @@ static class OptionalPathExtensionContentNegotiationStrategy
633620
@Override
634621
public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest)
635622
throws HttpMediaTypeNotAcceptableException {
636-
Object skip = webRequest.getAttribute(
637-
SKIP_PATH_EXTENSION_CONTENT_NEGOTIATION_ATTRIBUTE,
623+
Object skip = webRequest.getAttribute(SKIP_ATTRIBUTE,
638624
RequestAttributes.SCOPE_REQUEST);
639625
if (skip != null && Boolean.parseBoolean(skip.toString())) {
640626
return Collections.emptyList();
@@ -646,7 +632,7 @@ public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest)
646632

647633
/**
648634
* Condition used to disable the default MVC validator registration. The
649-
* {@link MvcValidatorPostProcessor} is used to configure the {@code mvcValidator}
635+
* {@link MvcValidatorRegistrar} is actually used to register the {@code mvcValidator}
650636
* bean.
651637
*/
652638
static class DisableMvcValidatorCondition implements ConfigurationCondition {
@@ -664,8 +650,8 @@ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
664650
}
665651

666652
/**
667-
* {@link BeanFactoryPostProcessor} to deal with the MVC validator bean registration.
668-
* Applies the following rules:
653+
* {@link ImportBeanDefinitionRegistrar} to deal with the MVC validator bean
654+
* registration. Applies the following rules:
669655
* <ul>
670656
* <li>With no validators - Uses standard
671657
* {@link WebMvcConfigurationSupport#mvcValidator()} logic.</li>
@@ -674,43 +660,45 @@ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
674660
* defined.</li>
675661
* </ul>
676662
*/
677-
@Order(Ordered.LOWEST_PRECEDENCE)
678-
static class MvcValidatorPostProcessor
679-
implements BeanDefinitionRegistryPostProcessor {
663+
static class MvcValidatorRegistrar
664+
implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
680665

681666
private static final String JSR303_VALIDATOR_CLASS = "javax.validation.Validator";
682667

668+
private BeanFactory beanFactory;
669+
683670
@Override
684-
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
685-
throws BeansException {
686-
if (registry instanceof ListableBeanFactory) {
687-
postProcess(registry, (ListableBeanFactory) registry);
688-
}
671+
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
672+
this.beanFactory = beanFactory;
689673
}
690674

691675
@Override
692-
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
693-
throws BeansException {
676+
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
677+
BeanDefinitionRegistry registry) {
678+
if (this.beanFactory instanceof ListableBeanFactory) {
679+
registerOrAliasMvcValidator(registry,
680+
(ListableBeanFactory) this.beanFactory);
681+
}
694682
}
695683

696-
private void postProcess(BeanDefinitionRegistry registry,
684+
private void registerOrAliasMvcValidator(BeanDefinitionRegistry registry,
697685
ListableBeanFactory beanFactory) {
698686
String[] validatorBeans = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
699687
beanFactory, Validator.class, false, false);
700688
if (validatorBeans.length == 0) {
701-
registerMvcValidator(registry, beanFactory);
689+
registerNewMvcValidator(registry, beanFactory);
702690
}
703691
else if (validatorBeans.length == 1) {
704692
registry.registerAlias(validatorBeans[0], "mvcValidator");
705693
}
706694
else {
707695
if (!ObjectUtils.containsElement(validatorBeans, "mvcValidator")) {
708-
registerMvcValidator(registry, beanFactory);
696+
registerNewMvcValidator(registry, beanFactory);
709697
}
710698
}
711699
}
712700

713-
private void registerMvcValidator(BeanDefinitionRegistry registry,
701+
private void registerNewMvcValidator(BeanDefinitionRegistry registry,
714702
ListableBeanFactory beanFactory) {
715703
RootBeanDefinition definition = new RootBeanDefinition();
716704
definition.setBeanClass(getClass());

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ public void validatorWhenUserDefinedJsr303AndSpringShouldUseDefined()
258258
}
259259

260260
@Test
261-
public void validatorWhenExcludingValidatorAutoConfigurationShouldUseMvc()
261+
public void validatorWhenExcludingValidatorAutoConfigurationShouldUseWebFlux()
262262
throws Exception {
263263
load(null, new Class[] { ValidationAutoConfiguration.class });
264264
Object webFluxValidator = this.context.getBean("webFluxValidator");
@@ -271,7 +271,7 @@ public void validatorWhenExcludingValidatorAutoConfigurationShouldUseMvc()
271271
}
272272

273273
@Test
274-
public void validatorWhenMultipleValidatorsAndNoWebFluxValidatorShouldAddMvc()
274+
public void validatorWhenMultipleValidatorsAndNoWebFluxValidatorShouldAddWebFlux()
275275
throws Exception {
276276
load(MultipleValidatorsAndNoWebFluxValidator.class);
277277
Object customValidator1 = this.context.getBean("customValidator1");
@@ -288,7 +288,7 @@ public void validatorWhenMultipleValidatorsAndNoWebFluxValidatorShouldAddMvc()
288288
}
289289

290290
@Test
291-
public void validatorWhenMultipleValidatorsAndWebFluxValidatorShouldUseMvc()
291+
public void validatorWhenMultipleValidatorsAndWebFluxValidatorShouldUseWebFlux()
292292
throws Exception {
293293
load(MultipleValidatorsAndWebFluxValidator.class);
294294
Object customValidator = this.context.getBean("customValidator");

0 commit comments

Comments
 (0)