Skip to content

Commit 08c5e5a

Browse files
christophstroblmp911de
authored andcommitted
Fix raw document conversion in Collection like properties.
Along the lines make sure to convert map like structures correctly if they do not come as a Document, eg. cause they got converted to a plain Map in a post load, pre convert event. Closes #3702 Original pull request: #3704.
1 parent f987217 commit 08c5e5a

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -1907,7 +1907,19 @@ public <S extends Object> S convert(Object source, TypeInformation<? extends S>
19071907
}
19081908

19091909
if (typeHint.isMap()) {
1910-
return (S) mapConverter.convert(this, (Bson) source, typeHint);
1910+
1911+
if(ClassUtils.isAssignable(Document.class, typeHint.getType())) {
1912+
return (S) documentConverter.convert(this, (Bson) source, typeHint);
1913+
}
1914+
1915+
if(source instanceof Bson) {
1916+
return (S) mapConverter.convert(this, (Bson) source, typeHint);
1917+
}
1918+
if(source instanceof Map) {
1919+
return (S) mapConverter.convert(this, new Document((Map<String,Object>) source), typeHint);
1920+
}
1921+
1922+
throw new IllegalArgumentException(String.format("Expected map like structure but found %s", source.getClass()));
19111923
}
19121924

19131925
if (source instanceof DBRef) {

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java

+39
Original file line numberDiff line numberDiff line change
@@ -2571,6 +2571,38 @@ void appliesCustomConverterEvenToSimpleTypes() {
25712571
assertThat(target.content).isInstanceOf(byte[].class);
25722572
}
25732573

2574+
@Test // GH-3702
2575+
void readsRawDocument() {
2576+
2577+
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)));
2578+
2579+
WithRawDocumentProperties target = converter.read(WithRawDocumentProperties.class, source);
2580+
2581+
assertThat(target.raw).isInstanceOf(org.bson.Document.class).isEqualTo( new org.bson.Document("simple", 1).append("document", new org.bson.Document("inner-doc", 1)));
2582+
}
2583+
2584+
@Test // GH-3702
2585+
void readsListOfRawDocument() {
2586+
2587+
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))));
2588+
2589+
WithRawDocumentProperties target = converter.read(WithRawDocumentProperties.class, source);
2590+
2591+
assertThat(target.listOfRaw)
2592+
.containsExactly(new org.bson.Document("simple", 1).append("document", new org.bson.Document("inner-doc", 1)));
2593+
}
2594+
2595+
@Test // GH-3692
2596+
void readsMapThatDoesNotComeAsDocument() {
2597+
2598+
org.bson.Document source = new org.bson.Document("_id", "id-1").append("mapOfObjects", Collections.singletonMap("simple", 1));
2599+
2600+
ClassWithMapProperty target = converter.read(ClassWithMapProperty.class, source);
2601+
2602+
assertThat(target.mapOfObjects).containsEntry("simple",1);
2603+
2604+
}
2605+
25742606
static class GenericType<T> {
25752607
T content;
25762608
}
@@ -3229,4 +3261,11 @@ public Set<Entry<String, String>> entrySet() {
32293261
return null;
32303262
}
32313263
}
3264+
3265+
static class WithRawDocumentProperties {
3266+
3267+
String id;
3268+
org.bson.Document raw;
3269+
List<org.bson.Document> listOfRaw;
3270+
}
32323271
}

0 commit comments

Comments
 (0)