Skip to content

Commit 2e9cd79

Browse files
committed
Avoid manually handling additional primitive elements in collection merging for PATCHes.
Fixes #2261.
1 parent ba2f405 commit 2e9cd79

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -352,10 +352,7 @@ private boolean handleArrayNode(ArrayNode array, Collection<Object> collection,
352352
for (JsonNode jsonNode : array) {
353353

354354
if (!value.hasNext()) {
355-
356-
collection.add(mapper.treeToValue(jsonNode, getTypeToMap(null, componentType).getType()));
357-
358-
continue;
355+
break;
359356
}
360357

361358
Object next = value.next();

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import com.fasterxml.jackson.annotation.JsonSubTypes;
5959
import com.fasterxml.jackson.annotation.JsonTypeInfo;
6060
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
61+
import com.fasterxml.jackson.core.JacksonException;
6162
import com.fasterxml.jackson.core.JsonParser;
6263
import com.fasterxml.jackson.core.JsonProcessingException;
6364
import com.fasterxml.jackson.databind.DeserializationContext;
@@ -66,6 +67,8 @@
6667
import com.fasterxml.jackson.databind.JsonNode;
6768
import com.fasterxml.jackson.databind.ObjectMapper;
6869
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
70+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
71+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
6972
import com.fasterxml.jackson.databind.module.SimpleModule;
7073
import com.fasterxml.jackson.databind.node.ObjectNode;
7174

@@ -109,6 +112,7 @@ void setUp() {
109112
mappingContext.getPersistentEntity(ArrayHolder.class);
110113
mappingContext.getPersistentEntity(Apple.class);
111114
mappingContext.getPersistentEntity(Pear.class);
115+
mappingContext.getPersistentEntity(WithCustomMappedPrimitiveCollection.class);
112116
mappingContext.afterPropertiesSet();
113117

114118
this.entities = new PersistentEntities(Collections.singleton(mappingContext));
@@ -645,6 +649,19 @@ void nestedEntitiesWithReadonlyFieldAreKeptForPut() throws Exception {
645649
assertThat(result.inner).isSameAs(inner);
646650
}
647651

652+
@Test // GH-2261
653+
void deserializesCustomCollectionOfPrimitives() throws Exception {
654+
655+
JsonNode node = new ObjectMapper().readTree("{ \"longs\" : [ \"foo:1\", \"bar:2\" ] }");
656+
657+
WithCustomMappedPrimitiveCollection collection = new WithCustomMappedPrimitiveCollection();
658+
collection.longs = Arrays.asList(3L);
659+
660+
WithCustomMappedPrimitiveCollection result = reader.doMerge((ObjectNode) node, collection, new ObjectMapper());
661+
662+
assertThat(result.longs).isEqualTo(Arrays.asList(1L, 2L));
663+
}
664+
648665
@SuppressWarnings("unchecked")
649666
private static <T> T as(Object source, Class<T> type) {
650667

@@ -904,4 +921,31 @@ static class Apple extends Fruit {
904921
static class Pear extends Fruit {
905922
String pear;
906923
}
924+
925+
// GH-2261
926+
static class WithCustomMappedPrimitiveCollection {
927+
928+
@JsonDeserialize(contentUsing = CustomDeserializer.class) //
929+
List<Long> longs;
930+
931+
@SuppressWarnings("serial")
932+
static class CustomDeserializer extends StdDeserializer<Long> {
933+
934+
protected CustomDeserializer() {
935+
super(Long.class);
936+
}
937+
938+
/*
939+
* (non-Javadoc)
940+
* @see com.fasterxml.jackson.databind.JsonDeserializer#deserialize(com.fasterxml.jackson.core.JsonParser, com.fasterxml.jackson.databind.DeserializationContext)
941+
*/
942+
@Override
943+
public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
944+
945+
String[] elements = p.getText().split(":");
946+
947+
return Long.valueOf(elements[elements.length - 1]);
948+
}
949+
}
950+
}
907951
}

0 commit comments

Comments
 (0)