Skip to content

Commit 404d64b

Browse files
authored
Fix Coercion fail message around Array and Object. (#3962)
1 parent 17eb07a commit 404d64b

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1421,7 +1421,7 @@ protected final String _parseString(JsonParser p, DeserializationContext ctxt,
14211421
return ob.toString();
14221422
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
14231423
case JsonTokenId.ID_START_OBJECT:
1424-
return ctxt.extractScalarFromObject(p, this, _valueClass);
1424+
return ctxt.extractScalarFromObject(p, this, rawTargetType);
14251425
case JsonTokenId.ID_NUMBER_INT:
14261426
act = _checkIntToStringCoercion(p, ctxt, rawTargetType);
14271427
break;
@@ -1453,7 +1453,7 @@ protected final String _parseString(JsonParser p, DeserializationContext ctxt,
14531453
return text;
14541454
}
14551455
}
1456-
return (String) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
1456+
return (String) ctxt.handleUnexpectedToken(rawTargetType, p);
14571457
}
14581458

14591459
/**

src/test/java/com/fasterxml/jackson/databind/convert/DisableCoercions3690Test.java

+64-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.fasterxml.jackson.databind.convert;
22

3-
import java.util.List;
4-
5-
import com.fasterxml.jackson.databind.*;
3+
import com.fasterxml.jackson.databind.BaseMapTest;
4+
import com.fasterxml.jackson.databind.JavaType;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
66
import com.fasterxml.jackson.databind.cfg.CoercionAction;
77
import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
88
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
9+
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
10+
import com.fasterxml.jackson.databind.type.TypeFactory;
11+
import java.util.List;
912

1013
public class DisableCoercions3690Test extends BaseMapTest
1114
{
@@ -14,6 +17,18 @@ static class Input3690 {
1417
public List<String> field;
1518
}
1619

20+
static class Input3924<T> {
21+
private T field;
22+
23+
public T getField() {
24+
return field;
25+
}
26+
27+
public void setField(T field) {
28+
this.field = field;
29+
}
30+
}
31+
1732
// [databind#3690]
1833
public void testCoercionFail3690() throws Exception
1934
{
@@ -38,4 +53,50 @@ public void testCoercionFail3690() throws Exception
3853
verifyException(e, "to `java.lang.String` value");
3954
}
4055
}
56+
57+
// [databind#3924]
58+
public void testFailMessage3924() throws Exception {
59+
// Arrange : Building a strict ObjectMapper.
60+
ObjectMapper mapper = jsonMapperBuilder()
61+
.withCoercionConfigDefaults(config -> {
62+
config.setCoercion(CoercionInputShape.Boolean, CoercionAction.Fail)
63+
.setCoercion(CoercionInputShape.Integer, CoercionAction.Fail)
64+
.setCoercion(CoercionInputShape.Float, CoercionAction.Fail)
65+
.setCoercion(CoercionInputShape.String, CoercionAction.Fail)
66+
.setCoercion(CoercionInputShape.Array, CoercionAction.Fail)
67+
.setCoercion(CoercionInputShape.Object, CoercionAction.Fail);
68+
})
69+
.build();
70+
71+
// Arrange : Type configuration
72+
TypeFactory typeFactory = mapper.getTypeFactory();
73+
JavaType arrayType = typeFactory.constructParametricType(List.class, String.class);
74+
JavaType inputType = typeFactory.constructParametricType(Input3924.class, arrayType);
75+
76+
// Act & Assert
77+
_verifyFailedCoercionWithInvalidFormat("{ \"field\": [ 1 ] }",
78+
"Cannot coerce Integer value (1) to `java.lang.String` value",
79+
mapper, inputType);
80+
81+
_verifyFailedCoercionWithInvalidFormat("{ \"field\": [ [ 1 ] ] }",
82+
"Cannot deserialize value of type `java.lang.String` from Array value",
83+
mapper, inputType);
84+
85+
_verifyFailedCoercionWithInvalidFormat("{ \"field\": [ { \"field\": 1 } ] }",
86+
"Cannot deserialize value of type `java.lang.String` from Object value",
87+
mapper, inputType);
88+
89+
}
90+
91+
private void _verifyFailedCoercionWithInvalidFormat(String jsonStr, String expectedMsg, ObjectMapper mapper,
92+
JavaType inputType) throws Exception
93+
{
94+
try {
95+
mapper.readValue(jsonStr, inputType);
96+
fail("Should not pass");
97+
} catch (MismatchedInputException e) {
98+
assertEquals(String.class, e.getTargetType());
99+
verifyException(e, expectedMsg);
100+
}
101+
}
41102
}

0 commit comments

Comments
 (0)