Skip to content

Commit 6326fe1

Browse files
committed
Properly merge non-entity arrays.
Fixes #2325.
1 parent 4f7884e commit 6326fe1

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,8 @@ private boolean handleArrayNode(ArrayNode array, Collection<Object> collection,
365365
if (array.isEmpty()
366366
|| collection.isEmpty()
367367
|| ClassUtils.isPrimitiveOrWrapper(componentType.getType())
368-
|| componentType.getType().isEnum()) {
368+
|| componentType.getType().isEnum()
369+
|| !entities.getPersistentEntity(componentType.getType()).isPresent()) {
369370
return false;
370371
}
371372

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

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

120121
this.entities = new PersistentEntities(Collections.singleton(mappingContext));
@@ -704,6 +705,42 @@ void deserializesNewNestedEntitiesCorrectly() throws Exception {
704705
.containsExactly("Foo", "Bar");
705706
}
706707

708+
@Test // #2325
709+
void arraysCanMutateAndAppendDuringMerge() throws Exception {
710+
711+
ObjectMapper mapper = new ObjectMapper();
712+
ArrayHolder target = new ArrayHolder(new String[] { "ancient", "old", "older" });
713+
JsonNode node = mapper.readTree("{ \"array\" : [ \"new\", \"old\", \"newer\", \"bleeding edge\" ] }");
714+
715+
ArrayHolder updated = reader.doMerge((ObjectNode) node, target, mapper);
716+
717+
assertThat(updated.array).containsExactly("new", "old", "newer", "bleeding edge");
718+
}
719+
720+
@Test // #2325
721+
void arraysCanAppendMoreThanOneElementDuringMerge() throws Exception {
722+
723+
ObjectMapper mapper = new ObjectMapper();
724+
ArrayListHolder target = new ArrayListHolder("ancient", "old", "older");
725+
JsonNode node = mapper.readTree("{ \"values\" : [ \"ancient\", \"old\", \"older\", \"new\", \"newer\" ] }");
726+
727+
ArrayListHolder updated = reader.doMerge((ObjectNode) node, target, mapper);
728+
729+
assertThat(updated.values).containsExactly("ancient", "old", "older", "new", "newer");
730+
}
731+
732+
@Test // #2325
733+
void arraysCanRemoveElementsDuringMerge() throws Exception {
734+
735+
ObjectMapper mapper = new ObjectMapper();
736+
ArrayHolder target = new ArrayHolder(new String[] { "ancient", "old", "older" });
737+
JsonNode node = mapper.readTree("{ \"array\" : [ \"ancient\" ] }");
738+
739+
ArrayHolder updated = reader.doMerge((ObjectNode) node, target, mapper);
740+
741+
assertThat(updated.array).containsExactly("ancient");
742+
}
743+
707744
@SuppressWarnings("unchecked")
708745
private static <T> T as(Object source, Class<T> type) {
709746

@@ -1000,4 +1037,16 @@ static class NestedModel {
10001037
public String value;
10011038
}
10021039
}
1040+
1041+
static class ArrayListHolder {
1042+
Collection<String> values;
1043+
1044+
ArrayListHolder(String... values) {
1045+
this.values = new ArrayList<>(Arrays.asList(values));
1046+
}
1047+
1048+
public void setValues(Collection<String> values) {
1049+
this.values = values;
1050+
}
1051+
}
10031052
}

0 commit comments

Comments
 (0)