diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/PrimaryDefaultValidatorPostProcessor.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/PrimaryDefaultValidatorPostProcessor.java index ff32b479ed..f60b1cdf4d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/PrimaryDefaultValidatorPostProcessor.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/PrimaryDefaultValidatorPostProcessor.java @@ -20,6 +20,7 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanFactoryUtils; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; @@ -37,6 +38,7 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; * as primary. * * @author Stephane Nicoll + * @author Matej Nedic */ class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegistrar, BeanFactoryAware { @@ -58,7 +60,7 @@ class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegist public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { BeanDefinition definition = getAutoConfiguredValidator(registry); if (definition != null) { - definition.setPrimary(!hasPrimarySpringValidator(registry)); + definition.setPrimary(!hasPrimarySpringValidator()); } } @@ -77,16 +79,27 @@ class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegist return this.beanFactory != null && this.beanFactory.isTypeMatch(name, type); } - private boolean hasPrimarySpringValidator(BeanDefinitionRegistry registry) { + private boolean hasPrimarySpringValidator() { String[] validatorBeans = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this.beanFactory, Validator.class, false, false); for (String validatorBean : validatorBeans) { - BeanDefinition definition = registry.getBeanDefinition(validatorBean); - if (definition != null && definition.isPrimary()) { + BeanDefinition definition = searchForBeanDefinition(this.beanFactory, validatorBean); + if (definition.isPrimary()) { return true; } } return false; } + private BeanDefinition searchForBeanDefinition(ConfigurableListableBeanFactory clbf, String validatorBean) { + if (clbf.containsLocalBean(validatorBean)) { + return clbf.getBeanDefinition(validatorBean); + } + else if (clbf.getParentBeanFactory() instanceof ConfigurableListableBeanFactory) { + return searchForBeanDefinition((ConfigurableListableBeanFactory) clbf.getParentBeanFactory(), + validatorBean); + } + throw new NoSuchBeanDefinitionException(validatorBean); + } + }