Browse Source

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.
pull/169/merge
Christoph Strobl 12 years ago committed by Oliver Gierke
parent
commit
31a4bf906e
  1. 6
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java
  2. 42
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserIntegrationTests.java
  3. 16
      spring-data-mongodb/src/test/resources/namespace/converter-nested-bean-definition.xml

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

@ -72,6 +72,7 @@ import org.w3c.dom.Element;
* @author Oliver Gierke * @author Oliver Gierke
* @author Maciej Walkowiak * @author Maciej Walkowiak
* @author Thomas Darimont * @author Thomas Darimont
* @author Christoph Strobl
*/ */
public class MappingMongoConverterParser implements BeanDefinitionParser { public class MappingMongoConverterParser implements BeanDefinitionParser {
@ -84,8 +85,11 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
*/ */
public BeanDefinition parse(Element element, ParserContext parserContext) { 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); String id = element.getAttribute(AbstractBeanDefinitionParser.ID_ATTRIBUTE);
id = StringUtils.hasText(id) ? id : DEFAULT_CONVERTER_BEAN_NAME; id = StringUtils.hasText(id) ? id : DEFAULT_CONVERTER_BEAN_NAME;

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

@ -21,7 +21,6 @@ import static org.junit.Assert.*;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
@ -49,18 +48,13 @@ import com.mongodb.DBObject;
* *
* @author Oliver Gierke * @author Oliver Gierke
* @author Thomas Darimont * @author Thomas Darimont
* @author Christoph Strobl
*/ */
public class MappingMongoConverterParserIntegrationTests { public class MappingMongoConverterParserIntegrationTests {
DefaultListableBeanFactory factory; @Rule public ExpectedException exception = ExpectedException.none();
public @Rule ExpectedException exception = ExpectedException.none();
@Before DefaultListableBeanFactory factory;
public void setUp() {
factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new ClassPathResource("namespace/converter.xml"));
}
/** /**
* @see DATAMONGO-243 * @see DATAMONGO-243
@ -68,6 +62,7 @@ public class MappingMongoConverterParserIntegrationTests {
@Test @Test
public void allowsDbFactoryRefAttribute() { public void allowsDbFactoryRefAttribute() {
loadValidConfiguration();
factory.getBeanDefinition("converter"); factory.getBeanDefinition("converter");
factory.getBean("converter"); factory.getBean("converter");
} }
@ -78,6 +73,7 @@ public class MappingMongoConverterParserIntegrationTests {
@Test @Test
public void hasCustomTypeMapper() { public void hasCustomTypeMapper() {
loadValidConfiguration();
MappingMongoConverter converter = factory.getBean("converter", MappingMongoConverter.class); MappingMongoConverter converter = factory.getBean("converter", MappingMongoConverter.class);
MongoTypeMapper customMongoTypeMapper = factory.getBean(CustomMongoTypeMapper.class); MongoTypeMapper customMongoTypeMapper = factory.getBean(CustomMongoTypeMapper.class);
@ -90,6 +86,7 @@ public class MappingMongoConverterParserIntegrationTests {
@Test @Test
public void scansForConverterAndSetsUpCustomConversionsAccordingly() { public void scansForConverterAndSetsUpCustomConversionsAccordingly() {
loadValidConfiguration();
CustomConversions conversions = factory.getBean(CustomConversions.class); CustomConversions conversions = factory.getBean(CustomConversions.class);
assertThat(conversions.hasCustomWriteTarget(Person.class), is(true)); assertThat(conversions.hasCustomWriteTarget(Person.class), is(true));
assertThat(conversions.hasCustomWriteTarget(Account.class), is(true)); assertThat(conversions.hasCustomWriteTarget(Account.class), is(true));
@ -101,6 +98,7 @@ public class MappingMongoConverterParserIntegrationTests {
@Test @Test
public void activatesAbbreviatingPropertiesCorrectly() { public void activatesAbbreviatingPropertiesCorrectly() {
loadValidConfiguration();
BeanDefinition definition = factory.getBeanDefinition("abbreviatingConverter.mongoMappingContext"); BeanDefinition definition = factory.getBeanDefinition("abbreviatingConverter.mongoMappingContext");
Object value = definition.getPropertyValues().getPropertyValue("fieldNamingStrategy").getValue(); Object value = definition.getPropertyValues().getPropertyValue("fieldNamingStrategy").getValue();
@ -124,6 +122,32 @@ public class MappingMongoConverterParserIntegrationTests {
reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-invalid.xml")); reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-invalid.xml"));
} }
/**
* @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 @Component
public static class SampleConverter implements Converter<Person, DBObject> { public static class SampleConverter implements Converter<Person, DBObject> {
public DBObject convert(Person source) { public DBObject convert(Person source) {

16
spring-data-mongodb/src/test/resources/namespace/converter-nested-bean-definition.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<mongo:db-factory id="factory" />
<bean class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg>
<mongo:mapping-converter />
</constructor-arg>
</bean>
</beans>
Loading…
Cancel
Save