From f3613688939fce7426486e4723f9a64db6eb0bac Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 4 Apr 2014 14:25:46 +0200 Subject: [PATCH] DATAMONGO-892 - Reject nested MappingMongoConverter declarations in XML. Mapping information is potentially required by multiple instances and thus must not be registered as nested bean. We now actively check for such an invalid scenario and explicitly reject it. Original pull request: #165. --- .../config/MappingMongoConverterParser.java | 6 ++- ...gMongoConverterParserIntegrationTests.java | 53 ++++++++++++++++--- .../converter-nested-bean-definition.xml | 16 ++++++ 3 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 spring-data-mongodb/src/test/resources/namespace/converter-nested-bean-definition.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java index 46491f6a3..3e1d2b0ae 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java @@ -71,6 +71,7 @@ import org.w3c.dom.Element; * @author Oliver Gierke * @author Maciej Walkowiak * @author Thomas Darimont + * @author Christoph Strobl */ public class MappingMongoConverterParser implements BeanDefinitionParser { @@ -83,8 +84,11 @@ public class MappingMongoConverterParser implements BeanDefinitionParser { */ public BeanDefinition parse(Element element, ParserContext parserContext) { - BeanDefinitionRegistry registry = parserContext.getRegistry(); + if (parserContext.isNested()) { + parserContext.getReaderContext().error("Mongo Converter must not be defined as nested bean.", element); + } + BeanDefinitionRegistry registry = parserContext.getRegistry(); String id = element.getAttribute(AbstractBeanDefinitionParser.ID_ATTRIBUTE); id = StringUtils.hasText(id) ? id : "mappingConverter"; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java index e8bc74bab..b37e8e942 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java @@ -21,9 +21,11 @@ import static org.junit.Assert.*; import java.util.Collections; import java.util.Set; -import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.parsing.BeanDefinitionParsingException; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.convert.TypeDescriptor; @@ -45,37 +47,45 @@ import com.mongodb.DBObject; * * @author Oliver Gierke * @author Thomas Darimont + * @author Christoph Strobl */ public class MappingMongoConverterParserIntegrationTests { + @Rule public ExpectedException exception = ExpectedException.none(); + DefaultListableBeanFactory factory; - @Before - public void setUp() { - factory = new DefaultListableBeanFactory(); - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); - reader.loadBeanDefinitions(new ClassPathResource("namespace/converter.xml")); - } - + /** + * @see DATAMONGO-243 + */ @Test public void allowsDbFactoryRefAttribute() { + loadValidConfiguration(); factory.getBeanDefinition("converter"); factory.getBean("converter"); } + /** + * @see DATAMONGO-725 + */ @Test public void hasCustomTypeMapper() { + loadValidConfiguration(); MappingMongoConverter converter = factory.getBean("converter", MappingMongoConverter.class); MongoTypeMapper customMongoTypeMapper = factory.getBean(CustomMongoTypeMapper.class); assertThat(converter.getTypeMapper(), is(customMongoTypeMapper)); } + /** + * @see DATAMONGO-301 + */ @Test public void scansForConverterAndSetsUpCustomConversionsAccordingly() { + loadValidConfiguration(); CustomConversions conversions = factory.getBean(CustomConversions.class); assertThat(conversions.hasCustomWriteTarget(Person.class), is(true)); assertThat(conversions.hasCustomWriteTarget(Account.class), is(true)); @@ -87,6 +97,7 @@ public class MappingMongoConverterParserIntegrationTests { @Test public void activatesAbbreviatingPropertiesCorrectly() { + loadValidConfiguration(); BeanDefinition definition = factory.getBeanDefinition("abbreviatingConverter.mappingContext"); Object value = definition.getPropertyValues().getPropertyValue("fieldNamingStrategy").getValue(); @@ -95,6 +106,32 @@ public class MappingMongoConverterParserIntegrationTests { assertThat(strategy.getBeanClassName(), is(CamelCaseAbbreviatingFieldNamingStrategy.class.getName())); } + /** + * @see DATAMONGO-892 + */ + @Test + public void shouldThrowBeanDefinitionParsingExceptionIfConverterDefinedAsNestedBean() { + + exception.expect(BeanDefinitionParsingException.class); + exception.expectMessage("Mongo Converter must not be defined as nested bean."); + + loadNestedBeanConfiguration(); + } + + private void loadValidConfiguration() { + this.loadConfiguration("namespace/converter.xml"); + } + + private void loadNestedBeanConfiguration() { + this.loadConfiguration("namespace/converter-nested-bean-definition.xml"); + } + + private void loadConfiguration(String configLocation) { + factory = new DefaultListableBeanFactory(); + XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); + reader.loadBeanDefinitions(new ClassPathResource(configLocation)); + } + @Component public static class SampleConverter implements Converter { public DBObject convert(Person source) { diff --git a/spring-data-mongodb/src/test/resources/namespace/converter-nested-bean-definition.xml b/spring-data-mongodb/src/test/resources/namespace/converter-nested-bean-definition.xml new file mode 100644 index 000000000..1ef0063ab --- /dev/null +++ b/spring-data-mongodb/src/test/resources/namespace/converter-nested-bean-definition.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + +