Skip to content

Commit d293891

Browse files
committed
Fix broken merge of nested arrays.
Fixes GH-2350.
1 parent 261fe22 commit d293891

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/DomainObjectReader.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -444,15 +444,8 @@ private void doMergeNestedMap(Map<Object, Object> source, ObjectNode node, Objec
444444
TypeInformation<?> typeToMap = getTypeToMap(sourceValue, valueType);
445445

446446
if (value instanceof ObjectNode && sourceValue != null) {
447-
448447
doMerge((ObjectNode) value, sourceValue, mapper);
449-
450-
} else if (value instanceof ArrayNode && sourceValue != null) {
451-
452-
handleArray(value, sourceValue, mapper, getTypeToMap(sourceValue, typeToMap), null);
453-
454448
} else {
455-
456449
source.put(mappedKey, mapper.treeToValue(value, typeToMap.getType()));
457450
}
458451

spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/DomainObjectReaderUnitTests.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ void setUp() {
115115
mappingContext.getPersistentEntity(WithCustomMappedPrimitiveCollection.class);
116116
mappingContext.getPersistentEntity(BugModel.class);
117117
mappingContext.getPersistentEntity(ArrayListHolder.class);
118+
mappingContext.getPersistentEntity(MapWrapper.class);
118119
mappingContext.afterPropertiesSet();
119120

120121
this.entities = new PersistentEntities(Collections.singleton(mappingContext));
@@ -742,6 +743,39 @@ void arraysCanRemoveElementsDuringMerge() throws Exception {
742743
assertThat(updated.array).containsExactly("ancient");
743744
}
744745

746+
@Test // GH-2350
747+
void replacesArrays() throws Exception {
748+
749+
ArrayHolder holder = new ArrayHolder(new String[] { "original" });
750+
751+
ObjectMapper mapper = new ObjectMapper();
752+
753+
JsonNode node = mapper.readTree("{ \"array\" : [ \"first\", \"update\" ] }");
754+
ArrayHolder result = reader.doMerge((ObjectNode) node, holder, mapper);
755+
756+
node = mapper.readTree("{ \"array\" : [ \"second\", \"update\" ] }");
757+
result = reader.doMerge((ObjectNode) node, holder, mapper);
758+
759+
assertThat(result.getArray()).isEqualTo(new String[] { "second", "update" });
760+
}
761+
762+
@Test // GH-2350
763+
void replacesNestedArrays() throws Exception {
764+
765+
MapWrapper wrapper = new MapWrapper();
766+
wrapper.map.put("array", new String[] { "original" });
767+
768+
ObjectMapper mapper = new ObjectMapper();
769+
770+
JsonNode node = mapper.readTree("{ \"map\" : { \"array\" : [ \"first\", \"update\" ] } }");
771+
MapWrapper result = reader.doMerge((ObjectNode) node, wrapper, mapper);
772+
773+
node = mapper.readTree("{ \"map\" : { \"array\" : [ \"second\", \"update\" ] } }");
774+
result = reader.doMerge((ObjectNode) node, wrapper, mapper);
775+
776+
assertThat(result.map.get("array")).isEqualTo(new String[] { "second", "update" });
777+
}
778+
745779
@SuppressWarnings("unchecked")
746780
private static <T> T as(Object source, Class<T> type) {
747781

@@ -1046,4 +1080,8 @@ public void setValues(Collection<String> values) {
10461080
this.values = values;
10471081
}
10481082
}
1083+
1084+
static class MapWrapper {
1085+
public Map<String, Object> map = new HashMap<>();
1086+
}
10491087
}

0 commit comments

Comments
 (0)