Skip to content

Commit 8ccfdbc

Browse files
committed
Fix #2522
1 parent 88be958 commit 8ccfdbc

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

release-notes/VERSION-2.x

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Project: jackson-databind
1111
#2503: Support `@JsonSerialize(keyUsing)` and `@JsonDeserialize(keyUsing)` on Key class
1212
#2511: Add `SerializationFeature.WRITE_SELF_REFERENCES_AS_NULL`
1313
(contributed by Joongsoo P)
14+
#2522: `DeserializationContext.handleMissingInstantiator()` throws `MismatchedInputException`
15+
for non-static inner classes
1416
- Add `SerializerProvider.findContentValueSerializer()` methods
1517

1618
2.10.1 (not yet released)

src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -1049,10 +1049,17 @@ public Object handleMissingInstantiator(Class<?> instClass, ValueInstantiator va
10491049
// 16-Oct-2016, tatu: This is either a definition problem (if no applicable creator
10501050
// exists), or input mismatch problem (otherwise) since none of existing creators
10511051
// match with token.
1052-
if ((valueInst != null) && !valueInst.canInstantiate()) {
1053-
msg = String.format("Cannot construct instance of %s (no Creators, like default construct, exist): %s",
1052+
// 24-Oct-2019, tatu: Further, as per [databind#2522], passing `null` ValueInstantiator
1053+
// should simply trigger definition problem
1054+
if (valueInst == null ) {
1055+
msg = String.format("Cannot construct instance of %s: %s",
10541056
ClassUtil.nameOf(instClass), msg);
1055-
return reportBadDefinition(constructType(instClass), msg);
1057+
return reportBadDefinition(instClass, msg);
1058+
}
1059+
if (!valueInst.canInstantiate()) {
1060+
msg = String.format("Cannot construct instance of %s (no Creators, like default constructor, exist): %s",
1061+
ClassUtil.nameOf(instClass), msg);
1062+
return reportBadDefinition(instClass, msg);
10561063
}
10571064
msg = String.format("Cannot construct instance of %s (although at least one Creator exists): %s",
10581065
ClassUtil.nameOf(instClass), msg);

src/test/java/com/fasterxml/jackson/databind/deser/creators/InnerClassCreatorTest.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5+
56
import com.fasterxml.jackson.databind.*;
6-
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
7+
import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
78

89
// For [databind#1501], [databind#1502], [databind#1503]; mostly to
910
// test that for non-static inner classes constructors are ignored
@@ -64,7 +65,7 @@ public void testIssue1501() throws Exception
6465
try {
6566
MAPPER.readValue(ser, Something1501.class);
6667
fail("Should not pass");
67-
} catch (MismatchedInputException e) {
68+
} catch (InvalidDefinitionException e) {
6869
verifyException(e, "Cannot construct instance");
6970
verifyException(e, "InnerSomething1501");
7071
verifyException(e, "non-static inner classes like this can only by instantiated using default");
@@ -77,7 +78,7 @@ public void testIssue1502() throws Exception
7778
try {
7879
MAPPER.readValue(ser, Something1502.class);
7980
fail("Should not pass");
80-
} catch (MismatchedInputException e) {
81+
} catch (InvalidDefinitionException e) {
8182
verifyException(e, "Cannot construct instance");
8283
verifyException(e, "InnerSomething1502");
8384
verifyException(e, "non-static inner classes like this can only by instantiated using default");

0 commit comments

Comments
 (0)