diff --git a/pom.xml b/pom.xml
index a6d5da9170..44059709f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3702-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index 0033bd11d5..4c945a804e 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3702-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index f62c8dc7f4..4d77363818 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3702-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 1f157e75bc..63362e94fe 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3702-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
index aced009cda..0979180881 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
@@ -2036,7 +2036,19 @@ public S convert(Object source, TypeInformation extends S>
}
if (typeHint.isMap()) {
- return (S) mapConverter.convert(this, (Bson) source, typeHint);
+
+ if(ClassUtils.isAssignable(Document.class, typeHint.getType())) {
+ return (S) documentConverter.convert(this, (Bson) source, typeHint);
+ }
+
+ if(source instanceof Bson) {
+ return (S) mapConverter.convert(this, (Bson) source, typeHint);
+ }
+ if(source instanceof Map) {
+ return (S) mapConverter.convert(this, new Document((Map) source), typeHint);
+ }
+
+ throw new IllegalArgumentException(String.format("Expected map like structure but found %s", source.getClass()));
}
if (source instanceof DBRef) {
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
index 369f6dbdef..146c29866f 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java
@@ -2568,6 +2568,38 @@ void readsMapContainingNullValue() {
.containsEntry("item3", "i3");
}
+ @Test // GH-3702
+ void readsRawDocument() {
+
+ org.bson.Document source = new org.bson.Document("_id", "id-1").append("raw", new org.bson.Document("simple", 1).append("document", new org.bson.Document("inner-doc", 1)));
+
+ WithRawDocumentProperties target = converter.read(WithRawDocumentProperties.class, source);
+
+ assertThat(target.raw).isInstanceOf(org.bson.Document.class).isEqualTo( new org.bson.Document("simple", 1).append("document", new org.bson.Document("inner-doc", 1)));
+ }
+
+ @Test // GH-3702
+ void readsListOfRawDocument() {
+
+ org.bson.Document source = new org.bson.Document("_id", "id-1").append("listOfRaw", Arrays.asList(new org.bson.Document("simple", 1).append("document", new org.bson.Document("inner-doc", 1))));
+
+ WithRawDocumentProperties target = converter.read(WithRawDocumentProperties.class, source);
+
+ assertThat(target.listOfRaw)
+ .containsExactly(new org.bson.Document("simple", 1).append("document", new org.bson.Document("inner-doc", 1)));
+ }
+
+ @Test // GH-3692
+ void readsMapThatDoesNotComeAsDocument() {
+
+ org.bson.Document source = new org.bson.Document("_id", "id-1").append("mapOfObjects", Collections.singletonMap("simple", 1));
+
+ ClassWithMapProperty target = converter.read(ClassWithMapProperty.class, source);
+
+ assertThat(target.mapOfObjects).containsEntry("simple",1);
+
+ }
+
static class GenericType {
T content;
}
@@ -3233,4 +3265,11 @@ static class WithFieldWrite {
write = org.springframework.data.mongodb.core.mapping.Field.Write.ALWAYS) Person writeAlwaysPerson;
}
+
+ static class WithRawDocumentProperties {
+
+ String id;
+ org.bson.Document raw;
+ List listOfRaw;
+ }
}