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 extends MongoPersistentEntity>, MongoPersistentProperty> mappingContext;
/**
* Creates a new {@link SpringDataMongodbSerializer} for the given {@link MappingContext}.
+ *
* @param mappingContext
*/
- public SpringDataMongodbSerializer(MappingContext extends MongoPersistentEntity>, 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;
+ }
}