Skip to content

Commit 6cec482

Browse files
committed
Fix broken merge of nested arrays.
Fixes GH-2350.
1 parent ae851d8 commit 6cec482

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
@@ -109,6 +109,7 @@ void setUp() {
109109
mappingContext.getPersistentEntity(WithCustomMappedPrimitiveCollection.class);
110110
mappingContext.getPersistentEntity(BugModel.class);
111111
mappingContext.getPersistentEntity(ArrayListHolder.class);
112+
mappingContext.getPersistentEntity(MapWrapper.class);
112113
mappingContext.afterPropertiesSet();
113114

114115
this.entities = new PersistentEntities(Collections.singleton(mappingContext));
@@ -736,6 +737,39 @@ void arraysCanRemoveElementsDuringMerge() throws Exception {
736737
assertThat(updated.array).containsExactly("ancient");
737738
}
738739

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

@@ -1128,4 +1162,8 @@ public void setValues(Collection<String> values) {
11281162
this.values = values;
11291163
}
11301164
}
1165+
1166+
static class MapWrapper {
1167+
public Map<String, Object> map = new HashMap<>();
1168+
}
11311169
}

0 commit comments

Comments
 (0)