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;
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);
}
}
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