Skip to content

Commit 593f068

Browse files
committed
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
1 parent 9e03430 commit 593f068

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java

+6-8
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.Set;
2525

2626
import org.springframework.beans.BeanMetadataElement;
27-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2827
import org.springframework.beans.factory.config.BeanDefinition;
2928
import org.springframework.beans.factory.config.BeanDefinitionHolder;
3029
import org.springframework.beans.factory.config.RuntimeBeanReference;
@@ -64,6 +63,7 @@
6463
import org.springframework.util.ClassUtils;
6564
import org.springframework.util.StringUtils;
6665
import org.springframework.util.xml.DomUtils;
66+
6767
import org.w3c.dom.Element;
6868

6969
/**
@@ -135,9 +135,7 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
135135
new BeanComponentDefinition(indexOperationsProviderBuilder.getBeanDefinition(), "indexOperationsProvider"));
136136
}
137137

138-
try {
139-
registry.getBeanDefinition(INDEX_HELPER_BEAN_NAME);
140-
} catch (NoSuchBeanDefinitionException ignored) {
138+
if (!registry.containsBeanDefinition(INDEX_HELPER_BEAN_NAME)) {
141139

142140
BeanDefinitionBuilder indexHelperBuilder = BeanDefinitionBuilder
143141
.genericBeanDefinition(MongoPersistentEntityIndexCreator.class);
@@ -151,7 +149,7 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
151149

152150
BeanDefinition validatingMongoEventListener = potentiallyCreateValidatingMongoEventListener(element, parserContext);
153151

154-
if (validatingMongoEventListener != null) {
152+
if (validatingMongoEventListener != null && !registry.containsBeanDefinition(VALIDATING_EVENT_LISTENER_BEAN_NAME)) {
155153
parserContext.registerBeanComponent(
156154
new BeanComponentDefinition(validatingMongoEventListener, VALIDATING_EVENT_LISTENER_BEAN_NAME));
157155
}
@@ -165,15 +163,16 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
165163
private BeanDefinition potentiallyCreateValidatingMongoEventListener(Element element, ParserContext parserContext) {
166164

167165
String disableValidation = element.getAttribute("disable-validation");
168-
boolean validationDisabled = StringUtils.hasText(disableValidation) && Boolean.valueOf(disableValidation);
166+
boolean validationDisabled = StringUtils.hasText(disableValidation) && Boolean.parseBoolean(disableValidation);
169167

170168
if (!validationDisabled) {
171169

172170
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
173-
RuntimeBeanReference validator = getValidator(builder, parserContext);
171+
RuntimeBeanReference validator = getValidator(element, parserContext);
174172

175173
if (validator != null) {
176174
builder.getRawBeanDefinition().setBeanClass(ValidatingMongoEventListener.class);
175+
builder.getRawBeanDefinition().setSource(element);
177176
builder.addConstructorArgValue(validator);
178177

179178
return builder.getBeanDefinition();
@@ -195,7 +194,6 @@ private RuntimeBeanReference getValidator(Object source, ParserContext parserCon
195194
validatorDef.setSource(source);
196195
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
197196
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef);
198-
parserContext.registerBeanComponent(new BeanComponentDefinition(validatorDef, validatorName));
199197

200198
return new RuntimeBeanReference(validatorName);
201199
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,15 @@ private void loadNestedBeanConfiguration() {
131131

132132
private void loadConfiguration(String configLocation) {
133133
factory = new DefaultListableBeanFactory();
134+
factory.setAllowBeanDefinitionOverriding(false);
134135
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
135136
reader.loadBeanDefinitions(new ClassPathResource(configLocation));
136137
}
137138

138139
private static void assertStrategyReferenceSetFor(String beanId) {
139140

140-
BeanDefinitionRegistry factory = new DefaultListableBeanFactory();
141+
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
142+
factory.setAllowBeanDefinitionOverriding(false);
141143
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
142144
reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-fieldnamingstrategy.xml"));
143145

0 commit comments

Comments
 (0)