From 9a8cb9751e021c2c8451cc28ad474febec8161cb Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Thu, 4 Jan 2018 15:25:57 -0800 Subject: [PATCH] Backport #1868 fix --- release-notes/VERSION-2.x | 2 ++ .../databind/deser/BuilderBasedDeserializer.java | 6 +++--- .../databind/jsontype/impl/ClassNameIdResolver.java | 3 +-- .../databind/deser/jdk/JDKCollectionsDeserTest.java | 12 ++++++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 87d3a4c286..b5849a7656 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -10,6 +10,8 @@ Project: jackson-databind #1854: NPE deserializing collection with `@JsonCreator` and `ACCEPT_CASE_INSENSITIVE_PROPERTIES` (reported by rue-jw@github) #1855: Blacklist for more serialization gadgets (dbcp/tomcat, spring) +#1868: Class name handling for JDK unmodifiable Collection types changed + (reported by Rob W) 2.9.3 (09-Dec-2017) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java index 19d78ff38b..b1ae5c17fb 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java @@ -165,7 +165,7 @@ public Boolean supportsUpdate(DeserializationConfig config) { /********************************************************** */ - protected final Object finishBuild(DeserializationContext ctxt, Object builder) + protected Object finishBuild(DeserializationContext ctxt, Object builder) throws IOException { // As per [databind#777], allow returning builder itself @@ -183,7 +183,7 @@ protected final Object finishBuild(DeserializationContext ctxt, Object builder) * Main deserialization method for bean-based objects (POJOs). */ @Override - public final Object deserialize(JsonParser p, DeserializationContext ctxt) + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // common case first: @@ -334,7 +334,7 @@ public Object deserializeFromObject(JsonParser p, DeserializationContext ctxt) */ @Override @SuppressWarnings("resource") - protected final Object _deserializeUsingPropertyBased(final JsonParser p, + protected Object _deserializeUsingPropertyBased(final JsonParser p, final DeserializationContext ctxt) throws IOException { diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/ClassNameIdResolver.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/ClassNameIdResolver.java index 718b5bf91f..e0464cf8a3 100644 --- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/ClassNameIdResolver.java +++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/ClassNameIdResolver.java @@ -134,8 +134,7 @@ private static boolean isJavaUtilCollectionClass(String clz, String type) if (clz.startsWith("Collections$")) { // 02-Jan-2017, tatu: As per [databind#1868], may need to leave Unmodifiable variants as is return (clz.indexOf(type) > 0) -// && !clz.contains("Unmodifiable"); - ; + && !clz.contains("Unmodifiable"); } if (clz.startsWith("Arrays$")) { return (clz.indexOf(type) > 0); diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKCollectionsDeserTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKCollectionsDeserTest.java index 26167bee59..875c61c80a 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKCollectionsDeserTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKCollectionsDeserTest.java @@ -46,8 +46,7 @@ public void testSingletonCollections() throws Exception assertEquals(28, result.iterator().next().x); } - // [databind#1868]: Not sure if this should or should not pass... - /* + // [databind#1868]: Verify class name serialized as is public void testUnmodifiableSet() throws Exception { ObjectMapper mapper = new ObjectMapper(); @@ -58,10 +57,15 @@ public void testUnmodifiableSet() throws Exception assertEquals("[\"java.util.Collections$UnmodifiableSet\",[\"a\"]]", json); - // and back... + // 04-Jan-2018, tatu: Alas, no way to make this actually work well, at this point. + // In theory could jiggle things back on deser, using one of two ways: + // + // 1) Do mapping to regular Set/List types (abstract type mapping): would work, but get rid of immutability + // 2) Have actually separate deserializer OR ValueInstantiator + /* Set result = mapper.readValue(json, Set.class); assertNotNull(result); assertEquals(1, result.size()); + */ } - */ }