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"/>
+