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 @@ + + + + + + + + + + + +