diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index e82d4cc68..985039439 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ 2.7.1 - 2.2.4 + 2.2.5 diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java index 3b5ef4ced..e0f42534e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java @@ -17,6 +17,7 @@ package org.springframework.data.mongodb.repository.support; import java.io.Serializable; import java.util.List; +import java.util.regex.Pattern; import org.apache.commons.collections15.Transformer; import org.springframework.data.domain.Page; @@ -27,6 +28,7 @@ import org.springframework.data.domain.Sort.Order; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.repository.query.MongoEntityInformation; @@ -35,6 +37,7 @@ import org.springframework.data.querydsl.QueryDslPredicateExecutor; import org.springframework.data.querydsl.SimpleEntityPathResolver; import org.springframework.data.repository.core.EntityMetadata; import org.springframework.util.Assert; + import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mysema.query.mongodb.MongodbQuery; @@ -85,7 +88,7 @@ public class QueryDslMongoRepository extends SimpleM Assert.notNull(resolver); EntityPath path = resolver.createPath(entityInformation.getJavaType()); this.builder = new PathBuilder(path.getType(), path.getMetadata()); - this.serializer = new SpringDataMongodbSerializer(mongoOperations.getConverter().getMappingContext()); + this.serializer = new SpringDataMongodbSerializer(mongoOperations.getConverter()); } /* @@ -230,14 +233,17 @@ public class QueryDslMongoRepository extends SimpleM */ static class SpringDataMongodbSerializer extends MongodbSerializer { + private final MongoConverter converter; private final MappingContext, MongoPersistentProperty> mappingContext; /** * Creates a new {@link SpringDataMongodbSerializer} for the given {@link MappingContext}. + * * @param mappingContext */ - public SpringDataMongodbSerializer(MappingContext, MongoPersistentProperty> mappingContext) { - this.mappingContext = mappingContext; + public SpringDataMongodbSerializer(MongoConverter converter) { + this.mappingContext = converter.getMappingContext(); + this.converter = converter; } @Override @@ -248,5 +254,11 @@ public class QueryDslMongoRepository extends SimpleM MongoPersistentProperty property = entity.getPersistentProperty(metadata.getExpression().toString()); return property.getFieldName(); } + + @Override + protected DBObject asDBObject(String key, Object value) { + + return super.asDBObject(key, value instanceof Pattern ? value : converter.convertToMongoType(value)); + } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java index fb4956c01..5df9fd1f6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java @@ -18,11 +18,21 @@ package org.springframework.data.mongodb.repository.support; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.data.mongodb.MongoDbFactory; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoConverter; +import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.repository.QPerson; import org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.SpringDataMongodbSerializer; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; import com.mysema.query.types.path.StringPath; /** @@ -30,10 +40,20 @@ import com.mysema.query.types.path.StringPath; * * @author Oliver Gierke */ +@RunWith(MockitoJUnitRunner.class) public class SpringDataMongodbSerializerUnitTests { - MongoMappingContext context = new MongoMappingContext(); - SpringDataMongodbSerializer serializer = new QueryDslMongoRepository.SpringDataMongodbSerializer(context); + @Mock + MongoDbFactory dbFactory; + MongoConverter converter; + SpringDataMongodbSerializer serializer; + + @Before + public void setUp() { + MongoMappingContext context = new MongoMappingContext(); + converter = new MappingMongoConverter(dbFactory, context); + serializer = new QueryDslMongoRepository.SpringDataMongodbSerializer(converter); + } @Test public void uses_idAsKeyForIdProperty() { @@ -47,4 +67,29 @@ public class SpringDataMongodbSerializerUnitTests { StringPath path = QPerson.person.address.street; assertThat(serializer.getKeyForPath(path, path.getMetadata()), is("street")); } + + @Test + public void convertsComplexObjectOnSerializing() { + + Address address = new Address(); + address.street = "Foo"; + address.zipCode = "01234"; + + DBObject result = serializer.asDBObject("foo", address); + assertThat(result, is(BasicDBObject.class)); + BasicDBObject dbObject = (BasicDBObject) result; + + Object value = dbObject.get("foo"); + assertThat(value, is(notNullValue())); + assertThat(value, is(BasicDBObject.class)); + + Object reference = converter.convertToMongoType(address); + assertThat(value, is(reference)); + } + + class Address { + String street; + @Field("zip_code") + String zipCode; + } }