Skip to content

Commit cd14544

Browse files
committed
Fix #1868 for good
1 parent 4c448ee commit cd14544

File tree

2 files changed

+35
-30
lines changed

2 files changed

+35
-30
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/impl/JavaUtilCollectionsDeserializers.java

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,27 @@ public abstract class JavaUtilCollectionsDeserializers
3434

3535
private final static Class<?> CLASS_AS_ARRAYS_LIST = Arrays.asList(null, null).getClass();
3636

37-
private final static Class<?> CLASS_SINGLETON_SET = Collections.singleton(Boolean.TRUE).getClass();
38-
private final static Class<?> CLASS_SINGLETON_LIST = Collections.singletonList(Boolean.TRUE).getClass();
39-
private final static Class<?> CLASS_SINGLETON_MAP = Collections.singletonMap("a", "b").getClass();
37+
private final static Class<?> CLASS_SINGLETON_SET;
38+
private final static Class<?> CLASS_SINGLETON_LIST;
39+
private final static Class<?> CLASS_SINGLETON_MAP;
40+
41+
private final static Class<?> CLASS_UNMODIFIABLE_SET;
42+
private final static Class<?> CLASS_UNMODIFIABLE_LIST;
43+
private final static Class<?> CLASS_UNMODIFIABLE_MAP;
44+
45+
static {
46+
Set<?> set = Collections.singleton(Boolean.TRUE);
47+
CLASS_SINGLETON_SET = set.getClass();
48+
CLASS_UNMODIFIABLE_SET = Collections.unmodifiableSet(set).getClass();
49+
50+
List<?> list = Collections.singletonList(Boolean.TRUE);
51+
CLASS_SINGLETON_LIST = list.getClass();
52+
CLASS_UNMODIFIABLE_LIST = Collections.unmodifiableList(list).getClass();
53+
54+
Map<?,?> map = Collections.singletonMap("a", "b");
55+
CLASS_SINGLETON_MAP = map.getClass();
56+
CLASS_UNMODIFIABLE_MAP = Collections.unmodifiableMap(map).getClass();
57+
}
4058

4159
public static JsonDeserializer<?> findForCollection(DeserializationContext ctxt,
4260
JavaType type)
@@ -46,11 +64,15 @@ public static JsonDeserializer<?> findForCollection(DeserializationContext ctxt,
4664

4765
// 10-Jan-2017, tatu: Some types from `java.util.Collections`/`java.util.Arrays` need bit of help...
4866
if (type.hasRawClass(CLASS_AS_ARRAYS_LIST)) {
49-
conv = converter(TYPE_AS_LIST, type);
67+
conv = converter(TYPE_AS_LIST, type, List.class);
5068
} else if (type.hasRawClass(CLASS_SINGLETON_LIST)) {
51-
conv = converter(TYPE_SINGLETON_LIST, type);
69+
conv = converter(TYPE_SINGLETON_LIST, type, List.class);
5270
} else if (type.hasRawClass(CLASS_SINGLETON_SET)) {
53-
conv = converter(TYPE_SINGLETON_SET, type);
71+
conv = converter(TYPE_SINGLETON_SET, type, Set.class);
72+
} else if (type.hasRawClass(CLASS_UNMODIFIABLE_LIST)) {
73+
conv = converter(TYPE_UNMODIFIABLE_LIST, type, List.class);
74+
} else if (type.hasRawClass(CLASS_UNMODIFIABLE_SET)) {
75+
conv = converter(TYPE_UNMODIFIABLE_SET, type, Set.class);
5476
} else {
5577
return null;
5678
}
@@ -65,36 +87,19 @@ public static JsonDeserializer<?> findForMap(DeserializationContext ctxt,
6587

6688
// 10-Jan-2017, tatu: Some types from `java.util.Collections`/`java.util.Arrays` need bit of help...
6789
if (type.hasRawClass(CLASS_SINGLETON_MAP)) {
68-
conv = converter(TYPE_SINGLETON_MAP, type);
90+
conv = converter(TYPE_SINGLETON_MAP, type, Map.class);
91+
} else if (type.hasRawClass(CLASS_UNMODIFIABLE_MAP)) {
92+
conv = converter(TYPE_UNMODIFIABLE_MAP, type, Map.class);
6993
} else {
7094
return null;
7195
}
7296
return new StdDelegatingDeserializer<Object>(conv);
7397
}
7498

75-
static JavaUtilCollectionsConverter converter(int kind, JavaType concreteType)
99+
static JavaUtilCollectionsConverter converter(int kind,
100+
JavaType concreteType, Class<?> rawSuper)
76101
{
77-
JavaType inputType;
78-
79-
switch (kind) {
80-
case TYPE_SINGLETON_SET:
81-
case TYPE_UNMODIFIABLE_SET:
82-
inputType = concreteType.findSuperType(Set.class);
83-
break;
84-
85-
case TYPE_SINGLETON_MAP:
86-
case TYPE_UNMODIFIABLE_MAP:
87-
inputType = concreteType.findSuperType(Map.class);
88-
break;
89-
90-
case TYPE_SINGLETON_LIST:
91-
case TYPE_UNMODIFIABLE_LIST:
92-
case TYPE_AS_LIST:
93-
default:
94-
inputType = concreteType.findSuperType(List.class);
95-
break;
96-
}
97-
return new JavaUtilCollectionsConverter(kind, inputType);
102+
return new JavaUtilCollectionsConverter(kind, concreteType.findSuperType(rawSuper));
98103
}
99104

100105
/**

src/test/java/com/fasterxml/jackson/failing/TestDefaultForUtilCollections1868.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/jdk/TestDefaultForUtilCollections1868.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.failing;
1+
package com.fasterxml.jackson.databind.deser.jdk;
22

33
import java.util.*;
44

0 commit comments

Comments
 (0)