Skip to content

Commit 18dc249

Browse files
committed
Fix #1941
1 parent c5bfb9a commit 18dc249

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

release-notes/VERSION

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ Project: jackson-databind
33
=== Releases ===
44
------------------------------------------------------------------------
55

6+
2.8.11.2 (not yet released)
7+
8+
#1941: `TypeFactory.constructFromCanonical()` throws NPE for Unparameterized
9+
generic canonical strings
10+
(reported by ayushgp@github)
11+
612
2.8.11.1 (11-Feb-2018)
713

814
#1872: `NullPointerException` in `SubTypeValidator.validateSubType` when

src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ public JavaType constructSpecializedType(JavaType baseType, Class<?> subclass)
352352
// also: if we start from untyped, not much to save
353353
do { // bogus loop to be able to break
354354
if (rawBase == Object.class) {
355-
newType = _fromClass(null, subclass, TypeBindings.emptyBindings());
355+
newType = _fromClass(null, subclass, EMPTY_BINDINGS);
356356
break;
357357
}
358358
if (!rawBase.isAssignableFrom(subclass)) {
@@ -363,7 +363,7 @@ public JavaType constructSpecializedType(JavaType baseType, Class<?> subclass)
363363

364364
// (1) Original target type has no generics -- just resolve subtype
365365
if (baseType.getBindings().isEmpty()) {
366-
newType = _fromClass(null, subclass, TypeBindings.emptyBindings());
366+
newType = _fromClass(null, subclass, EMPTY_BINDINGS);
367367
break;
368368
}
369369
// (2) A small set of "well-known" List/Map subtypes where can take a short-cut
@@ -893,7 +893,7 @@ public JavaType constructParametricType(Class<?> parametrized, Class<?>... param
893893
int len = parameterClasses.length;
894894
JavaType[] pt = new JavaType[len];
895895
for (int i = 0; i < len; ++i) {
896-
pt[i] = _fromClass(null, parameterClasses[i], null);
896+
pt[i] = _fromClass(null, parameterClasses[i], EMPTY_BINDINGS);
897897
}
898898
return constructParametricType(parametrized, pt);
899899
}

src/main/java/com/fasterxml/jackson/databind/type/TypeParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ protected JavaType parseType(MyTokenizer tokens)
5656
// can be comma that separates types, or closing '>'
5757
tokens.pushBack(token);
5858
}
59-
return _factory._fromClass(null, base, null);
59+
return _factory._fromClass(null, base, TypeBindings.emptyBindings());
6060
}
6161

6262
protected List<JavaType> parseTypes(MyTokenizer tokens)

src/test/java/com/fasterxml/jackson/databind/type/TestTypeFactory.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,22 @@ public void testCanonicalNames()
231231
assertEquals("java.util.EnumMap<com.fasterxml.jackson.databind.type.TestTypeFactory$EnumForCanonical,java.lang.String>",
232232
can);
233233
assertEquals(t, tf.constructFromCanonical(can));
234+
235+
// [databind#1941]: allow "raw" types too
236+
237+
t = tf.constructFromCanonical("java.util.List");
238+
assertEquals(List.class, t.getRawClass());
239+
assertEquals(CollectionType.class, t.getClass());
240+
// 01-Mar-2018, tatu: not 100% should we expect type parameters here...
241+
// But currently we do NOT get any
242+
/*
243+
assertEquals(1, t.containedTypeCount());
244+
assertEquals(Object.class, t.containedType(0).getRawClass());
245+
*/
246+
assertEquals(Object.class, t.getContentType().getRawClass());
247+
can = t.toCanonical();
248+
assertEquals("java.util.List<java.lang.Object>", can);
249+
assertEquals(t, tf.constructFromCanonical(can));
234250
}
235251

236252
// [databind#1768]

0 commit comments

Comments
 (0)