Skip to content

Commit 0263191

Browse files
committed
Fix #4602: handling of Array-delegating Creator
1 parent 8a42895 commit 0263191

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

release-notes/CREDITS-2.x

+5
Original file line numberDiff line numberDiff line change
@@ -1812,3 +1812,8 @@ Alexandre Jacob (ajacob@github)
18121812
* Reported #4545: Unexpected deserialization behavior with `@JsonCreator`,
18131813
`@JsonProperty` and javac `-parameters`
18141814
(2.18.0)
1815+
1816+
Eduard Gomoliako (Gems@github)
1817+
* Reported #4602: Possible wrong use of _arrayDelegateDeserializer in
1818+
BeanDeserializerBase::deserializeFromObjectUsingNonDefault()
1819+
(2.18.0)

release-notes/VERSION-2.x

+3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ Project: jackson-databind
5050
#4570: Deprecate `ObjectMapper.canDeserialize()`/`ObjectMapper.canSerialize()`
5151
#4580: Add `MapperFeature.SORT_CREATOR_PROPERTIES_BY_DECLARATION_ORDER` to use
5252
Creator properties' declaration order for sorting
53+
#4602: Possible wrong use of _arrayDelegateDeserializer in
54+
BeanDeserializerBase::deserializeFromObjectUsingNonDefault()
55+
(reported by Eduard G)
5356

5457
2.17.2 (not yet released)
5558

src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -1482,7 +1482,9 @@ protected Object deserializeFromObjectId(JsonParser p, DeserializationContext ct
14821482
protected Object deserializeFromObjectUsingNonDefault(JsonParser p,
14831483
DeserializationContext ctxt) throws IOException
14841484
{
1485-
final JsonDeserializer<Object> delegateDeser = _delegateDeserializer();
1485+
// 02-Jul-2024, tatu: [databind#4602] Need to tweak regular and "array" delegating
1486+
// Creator handling
1487+
final JsonDeserializer<Object> delegateDeser = _delegateDeserializer(p);
14861488
if (delegateDeser != null) {
14871489
final Object bean = _valueInstantiator.createUsingDelegate(ctxt,
14881490
delegateDeser.deserialize(p, ctxt));
@@ -1505,7 +1507,7 @@ protected Object deserializeFromObjectUsingNonDefault(JsonParser p,
15051507
// 01-May-2022, tatu: [databind#3417] special handling for (Graal) native images
15061508
if (NativeImageUtil.needsReflectionConfiguration(raw)) {
15071509
return ctxt.handleMissingInstantiator(raw, null, p,
1508-
"cannot deserialize from Object value (no delegate- or property-based Creator): this appears to be a native image, in which case you may need to configure reflection for the class that is to be deserialized");
1510+
"cannot deserialize from Object value (no delegate- or property-based Creator): this appears to be a native image, in which case you may need to configure reflection for the class that is to be deserialized");
15091511
}
15101512
return ctxt.handleMissingInstantiator(raw, getValueInstantiator(), p,
15111513
"cannot deserialize from Object value (no delegate- or property-based Creator)");
@@ -1710,6 +1712,26 @@ protected final JsonDeserializer<Object> _delegateDeserializer() {
17101712
return deser;
17111713
}
17121714

1715+
/**
1716+
* Alternate to {@link #_delegateDeserializer()} which will only consider
1717+
* {@code _arrayDelegateDeserializer} if given {@link JsonParser} points to
1718+
* {@link JsonToken#START_ARRAY} token.
1719+
*
1720+
* @since 2.18
1721+
*/
1722+
protected final JsonDeserializer<Object> _delegateDeserializer(JsonParser p) {
1723+
if (_delegateDeserializer == null) {
1724+
// Note! Will not call `JsonParser.isExpectedArrayToken()` as that could
1725+
// "transform" `JsonToken.START_OBJECT` into `JsonToken.START_ARRAY` and
1726+
// here there is no strong expectation of Array value
1727+
if ((_arrayDelegateDeserializer != null)
1728+
&& p.hasToken(JsonToken.START_ARRAY)) {
1729+
return _arrayDelegateDeserializer;
1730+
}
1731+
}
1732+
return _delegateDeserializer;
1733+
}
1734+
17131735
/*
17141736
/**********************************************************
17151737
/* Overridable helper methods

0 commit comments

Comments
 (0)