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 77647a9ea..438c2f175 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 @@ -70,6 +70,7 @@ import org.w3c.dom.Element; * @author Jon Brisbin * @author Oliver Gierke * @author Maciej Walkowiak + * @author Thomas Darimont */ public class MappingMongoConverterParser implements BeanDefinitionParser { @@ -105,6 +106,11 @@ public class MappingMongoConverterParser implements BeanDefinitionParser { converterBuilder.addConstructorArgReference(dbFactoryRef); converterBuilder.addConstructorArgReference(ctxRef); + String typeMapperRef = element.getAttribute("type-mapper-ref"); + if (StringUtils.hasText(typeMapperRef)) { + converterBuilder.addPropertyReference("typeMapper", typeMapperRef); + } + if (conversionsDefinition != null) { converterBuilder.addPropertyValue("customConversions", conversionsDefinition); } diff --git a/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.3.xsd b/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.3.xsd index 3b8ba7b18..430056bfb 100644 --- a/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.3.xsd +++ b/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.3.xsd @@ -181,10 +181,10 @@ The base package in which to scan for entities annotated with @Document - + - The reference to a Mongo. Will default to 'mongo'. + The reference to a MongoTypeMapper to be used by this MappingMongoConverter. @@ -195,13 +195,6 @@ The base package in which to scan for entities annotated with @Document - - - - The reference to a MongoTemplate. Will default to 'mongoTemplate'. - - - @@ -257,6 +250,17 @@ The name of the Mongo object that determines what server to monitor. (by default + + + + + + + + + + + diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java index dd0d5b164..18ba7f135 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractMongoConfigurationUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 the original author or authors. + * Copyright 2012-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,11 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDbFactory; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoTypeMapper; import org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; @@ -37,6 +40,7 @@ import com.mongodb.Mongo; * Unit tests for {@link AbstractMongoConfiguration}. * * @author Oliver Gierke + * @author Thomas Darimont */ public class AbstractMongoConfigurationUnitTests { @@ -113,6 +117,20 @@ public class AbstractMongoConfigurationUnitTests { assertThat(spElContext.getBeanResolver(), is(notNullValue())); } + /** + * @see DATAMONGO-725 + */ + @Test + public void shouldBeAbleToConfigureCustomTypeMapperViaJavaConfig() { + + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SampleMongoConfiguration.class); + MongoTypeMapper typeMapper = context.getBean(CustomMongoTypeMapper.class); + MappingMongoConverter mmc = context.getBean(MappingMongoConverter.class); + + assertThat(mmc, is(notNullValue())); + assertThat(mmc.getTypeMapper(), is(typeMapper)); + } + private static void assertScanningDisabled(final String value) throws ClassNotFoundException { AbstractMongoConfiguration configuration = new SampleMongoConfiguration() { @@ -138,6 +156,19 @@ public class AbstractMongoConfigurationUnitTests { public Mongo mongo() throws Exception { return new Mongo(); } + + @Bean + @Override + public MappingMongoConverter mappingMongoConverter() throws Exception { + MappingMongoConverter mmc = super.mappingMongoConverter(); + mmc.setTypeMapper(typeMapper()); + return mmc; + } + + @Bean + public MongoTypeMapper typeMapper() { + return new CustomMongoTypeMapper(); + } } @Document diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/CustomMongoTypeMapper.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/CustomMongoTypeMapper.java new file mode 100644 index 000000000..b3d188157 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/CustomMongoTypeMapper.java @@ -0,0 +1,23 @@ +/* + * Copyright 2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.config; + +import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; + +/** + * @author Thomas Darimont + */ +class CustomMongoTypeMapper extends DefaultMongoTypeMapper {} 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 cb9af3806..e8bc74bab 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 @@ -31,6 +31,8 @@ import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.GenericConverter; import org.springframework.core.io.ClassPathResource; import org.springframework.data.mongodb.core.convert.CustomConversions; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoTypeMapper; import org.springframework.data.mongodb.core.mapping.Account; import org.springframework.data.mongodb.core.mapping.CamelCaseAbbreviatingFieldNamingStrategy; import org.springframework.data.mongodb.repository.Person; @@ -42,6 +44,7 @@ import com.mongodb.DBObject; * Integration tests for {@link MappingMongoConverterParser}. * * @author Oliver Gierke + * @author Thomas Darimont */ public class MappingMongoConverterParserIntegrationTests { @@ -61,6 +64,15 @@ public class MappingMongoConverterParserIntegrationTests { factory.getBean("converter"); } + @Test + public void hasCustomTypeMapper() { + + MappingMongoConverter converter = factory.getBean("converter", MappingMongoConverter.class); + MongoTypeMapper customMongoTypeMapper = factory.getBean(CustomMongoTypeMapper.class); + + assertThat(converter.getTypeMapper(), is(customMongoTypeMapper)); + } + @Test public void scansForConverterAndSetsUpCustomConversionsAccordingly() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserValidationIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserValidationIntegrationTests.java index 762c8a8bd..f89bb1d65 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserValidationIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/MappingMongoConverterParserValidationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012 the original author or authors. + * Copyright 2012-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,6 +33,7 @@ import org.springframework.core.io.ClassPathResource; * * @see DATAMONGO-36 * @author Maciej Walkowiak + * @author Thomas Darimont */ public class MappingMongoConverterParserValidationIntegrationTests { @@ -65,4 +66,11 @@ public class MappingMongoConverterParserValidationIntegrationTests { reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-validation-disabled.xml")); factory.getBean(BeanNames.VALIDATING_EVENT_LISTENER); } + + @Test + public void validatingEventListenerCreatedWithCustomTypeMapperConfig() { + + reader.loadBeanDefinitions(new ClassPathResource("namespace/converter-custom-typeMapper.xml")); + assertThat(factory.getBean(BeanNames.VALIDATING_EVENT_LISTENER), is(not(nullValue()))); + } } diff --git a/spring-data-mongodb/src/test/resources/namespace/converter-custom-typeMapper.xml b/spring-data-mongodb/src/test/resources/namespace/converter-custom-typeMapper.xml new file mode 100644 index 000000000..bb1037c5f --- /dev/null +++ b/spring-data-mongodb/src/test/resources/namespace/converter-custom-typeMapper.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/spring-data-mongodb/src/test/resources/namespace/converter.xml b/spring-data-mongodb/src/test/resources/namespace/converter.xml index 7aef47ceb..91842765d 100644 --- a/spring-data-mongodb/src/test/resources/namespace/converter.xml +++ b/spring-data-mongodb/src/test/resources/namespace/converter.xml @@ -5,12 +5,14 @@ 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"> - + + + diff --git a/spring-data-mongodb/src/test/resources/template-mapping.xml b/spring-data-mongodb/src/test/resources/template-mapping.xml index 001d3f4fa..2e952b4aa 100644 --- a/spring-data-mongodb/src/test/resources/template-mapping.xml +++ b/spring-data-mongodb/src/test/resources/template-mapping.xml @@ -35,8 +35,7 @@ - + diff --git a/src/docbkx/reference/mongodb.xml b/src/docbkx/reference/mongodb.xml index 922c9cf21..32215fba3 100644 --- a/src/docbkx/reference/mongodb.xml +++ b/src/docbkx/reference/mongodb.xml @@ -1057,6 +1057,77 @@ mongoTemplate.save(sample); instance of that interface can be configured at the DefaultMongoTypeMapper which can be configured in turn on MappingMongoConverter. + + + Defining a TypeAlias for an Entity + + @TypeAlias("pers") +class Person { + +} + + Note that the resulting document will contain + "pers" as the value in the _class + Field. + + + + + Configuring custom type mapping + + The following example demonstrates how to configure a custom + MongoTypeMapper in + MappingMongoConverter. + + + Configuring a custom MongoTypeMapper via Spring Java + Config + + class CustomMongoTypeMapper extends DefaultMongoTypeMapper { + //implement custom type mapping here +} + + @Configuration +class SampleMongoConfiguration extends AbstractMongoConfiguration { + + @Override + protected String getDatabaseName() { + return "database"; + } + + @Override + public Mongo mongo() throws Exception { + return new Mongo(); + } + + @Bean + @Override + public MappingMongoConverter mappingMongoConverter() throws Exception { + MappingMongoConverter mmc = super.mappingMongoConverter(); + mmc.setTypeMapper(customTypeMapper()); + return mmc; + } + + @Bean + public MongoTypeMapper customTypeMapper() { + return new CustomMongoTypeMapper(); + } +} + + Note that we are extending the + AbstractMongoConfiguration class and override + the bean definition of the + MappingMongoConverter where we configure our + custom MongoTypeMapper. + + + + Configuring a custom MongoTypeMapper via XML + + <mongo:mapping-converter type-mapper-ref="customMongoTypeMapper"/> + +<bean name="customMongoTypeMapper" class="com.bubu.mongo.CustomMongoTypeMapper"/> +