Avoid duplicate bean registrations in MappingMongoConverterParser.
We now ensure to not override `ValidatingMongoEventListener` and `LocalValidatorFactoryBean` bean definitions by avoiding duplicate registrations and checking whether a bean with the given name is already registered. Closes #4087
This commit is contained in:
@@ -24,7 +24,6 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.beans.BeanMetadataElement;
|
import org.springframework.beans.BeanMetadataElement;
|
||||||
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.BeanDefinitionHolder;
|
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||||
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
||||||
@@ -64,6 +63,7 @@ import org.springframework.util.Assert;
|
|||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.util.xml.DomUtils;
|
import org.springframework.util.xml.DomUtils;
|
||||||
|
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,9 +135,7 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
new BeanComponentDefinition(indexOperationsProviderBuilder.getBeanDefinition(), "indexOperationsProvider"));
|
new BeanComponentDefinition(indexOperationsProviderBuilder.getBeanDefinition(), "indexOperationsProvider"));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
if (!registry.containsBeanDefinition(INDEX_HELPER_BEAN_NAME)) {
|
||||||
registry.getBeanDefinition(INDEX_HELPER_BEAN_NAME);
|
|
||||||
} catch (NoSuchBeanDefinitionException ignored) {
|
|
||||||
|
|
||||||
BeanDefinitionBuilder indexHelperBuilder = BeanDefinitionBuilder
|
BeanDefinitionBuilder indexHelperBuilder = BeanDefinitionBuilder
|
||||||
.genericBeanDefinition(MongoPersistentEntityIndexCreator.class);
|
.genericBeanDefinition(MongoPersistentEntityIndexCreator.class);
|
||||||
@@ -151,7 +149,7 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
|
|
||||||
BeanDefinition validatingMongoEventListener = potentiallyCreateValidatingMongoEventListener(element, parserContext);
|
BeanDefinition validatingMongoEventListener = potentiallyCreateValidatingMongoEventListener(element, parserContext);
|
||||||
|
|
||||||
if (validatingMongoEventListener != null) {
|
if (validatingMongoEventListener != null && !registry.containsBeanDefinition(VALIDATING_EVENT_LISTENER_BEAN_NAME)) {
|
||||||
parserContext.registerBeanComponent(
|
parserContext.registerBeanComponent(
|
||||||
new BeanComponentDefinition(validatingMongoEventListener, VALIDATING_EVENT_LISTENER_BEAN_NAME));
|
new BeanComponentDefinition(validatingMongoEventListener, VALIDATING_EVENT_LISTENER_BEAN_NAME));
|
||||||
}
|
}
|
||||||
@@ -165,15 +163,16 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
private BeanDefinition potentiallyCreateValidatingMongoEventListener(Element element, ParserContext parserContext) {
|
private BeanDefinition potentiallyCreateValidatingMongoEventListener(Element element, ParserContext parserContext) {
|
||||||
|
|
||||||
String disableValidation = element.getAttribute("disable-validation");
|
String disableValidation = element.getAttribute("disable-validation");
|
||||||
boolean validationDisabled = StringUtils.hasText(disableValidation) && Boolean.valueOf(disableValidation);
|
boolean validationDisabled = StringUtils.hasText(disableValidation) && Boolean.parseBoolean(disableValidation);
|
||||||
|
|
||||||
if (!validationDisabled) {
|
if (!validationDisabled) {
|
||||||
|
|
||||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
|
||||||
RuntimeBeanReference validator = getValidator(builder, parserContext);
|
RuntimeBeanReference validator = getValidator(element, parserContext);
|
||||||
|
|
||||||
if (validator != null) {
|
if (validator != null) {
|
||||||
builder.getRawBeanDefinition().setBeanClass(ValidatingMongoEventListener.class);
|
builder.getRawBeanDefinition().setBeanClass(ValidatingMongoEventListener.class);
|
||||||
|
builder.getRawBeanDefinition().setSource(element);
|
||||||
builder.addConstructorArgValue(validator);
|
builder.addConstructorArgValue(validator);
|
||||||
|
|
||||||
return builder.getBeanDefinition();
|
return builder.getBeanDefinition();
|
||||||
@@ -195,7 +194,6 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
validatorDef.setSource(source);
|
validatorDef.setSource(source);
|
||||||
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||||
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef);
|
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef);
|
||||||
parserContext.registerBeanComponent(new BeanComponentDefinition(validatorDef, validatorName));
|
|
||||||
|
|
||||||
return new RuntimeBeanReference(validatorName);
|
return new RuntimeBeanReference(validatorName);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,13 +131,15 @@ public class MappingMongoConverterParserIntegrationTests {
|
|||||||
|
|
||||||
private void loadConfiguration(String configLocation) {
|
private void loadConfiguration(String configLocation) {
|
||||||
factory = new DefaultListableBeanFactory();
|
factory = new DefaultListableBeanFactory();
|
||||||
|
factory.setAllowBeanDefinitionOverriding(false);
|
||||||
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
|
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
|
||||||
reader.loadBeanDefinitions(new ClassPathResource(configLocation));
|
reader.loadBeanDefinitions(new ClassPathResource(configLocation));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void assertStrategyReferenceSetFor(String beanId) {
|
private static void assertStrategyReferenceSetFor(String beanId) {
|
||||||
|
|
||||||
BeanDefinitionRegistry factory = new DefaultListableBeanFactory();
|
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
|
||||||
|
factory.setAllowBeanDefinitionOverriding(false);
|
||||||
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
|
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
|
||||||
reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-fieldnamingstrategy.xml"));
|
reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-fieldnamingstrategy.xml"));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user