Commit 89581015 authored by MatejNedic's avatar MatejNedic Committed by Andy Wilkinson

Fix no such bean definition with ancestor-defined Validator

See gh-25800
parent 7d632ea3
...@@ -20,6 +20,7 @@ import org.springframework.beans.BeansException; ...@@ -20,6 +20,7 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanFactoryUtils; 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.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistry;
...@@ -37,6 +38,7 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; ...@@ -37,6 +38,7 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
* as primary. * as primary.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Matej Nedic
*/ */
class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegistrar, BeanFactoryAware { class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
...@@ -58,7 +60,7 @@ class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegist ...@@ -58,7 +60,7 @@ class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegist
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition definition = getAutoConfiguredValidator(registry); BeanDefinition definition = getAutoConfiguredValidator(registry);
if (definition != null) { if (definition != null) {
definition.setPrimary(!hasPrimarySpringValidator(registry)); definition.setPrimary(!hasPrimarySpringValidator());
} }
} }
...@@ -77,16 +79,27 @@ class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegist ...@@ -77,16 +79,27 @@ class PrimaryDefaultValidatorPostProcessor implements ImportBeanDefinitionRegist
return this.beanFactory != null && this.beanFactory.isTypeMatch(name, type); 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, String[] validatorBeans = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this.beanFactory, Validator.class,
false, false); false, false);
for (String validatorBean : validatorBeans) { for (String validatorBean : validatorBeans) {
BeanDefinition definition = registry.getBeanDefinition(validatorBean); BeanDefinition definition = searchForBeanDefinition(this.beanFactory, validatorBean);
if (definition != null && definition.isPrimary()) { if (definition.isPrimary()) {
return true; return true;
} }
} }
return false; 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);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment