Skip to content

Commit f36222e

Browse files
committed
Fix #2303
1 parent 4b630c6 commit f36222e

File tree

11 files changed

+54
-14
lines changed

11 files changed

+54
-14
lines changed

release-notes/CREDITS-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,3 +837,8 @@ Joffrey Bion (joffrey-bion@github)
837837
Christoph (cfiehe@github.com)
838838
* Contributed #2299: Fix for using jackson-databind in an OSGi environment under Android
839839
(2.9.9)
840+
841+
Cyril Martin (mcoolive@github.com)
842+
* Reported #2303: Deserialize null, when java type is "TypeRef of TypeRef of T",
843+
does not provide "Type(Type(null))"
844+
(2.9.9)

release-notes/VERSION-2.x

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ Project: jackson-databind
1616
(reported by Joffrey B)
1717
#2299: Fix for using jackson-databind in an OSGi environment under Android
1818
(contributed by Christoph F)
19+
#2303: Deserialize null, when java type is "TypeRef of TypeRef of T", does not provide "Type(Type(null))"
20+
(reported by Cyril M)
1921
- Prevent String coercion of `null` in `WritableObjectId` when calling `JsonGenerator.writeObjectId()`,
2022
mostly relevant for formats like YAML that have native Object Ids
2123

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
131131
if (_valueDeserializer == deser) {
132132
return this;
133133
}
134-
return new CreatorProperty(this, deser, _nullProvider);
134+
// 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were
135+
NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider;
136+
return new CreatorProperty(this, deser, nvp);
135137
}
136138

137139
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
8989
if (_valueDeserializer == deser) {
9090
return this;
9191
}
92-
return new FieldProperty(this, deser, _nullProvider);
92+
// 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were
93+
NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider;
94+
return new FieldProperty(this, deser, nvp);
9395
}
9496

9597
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
8080
if (_valueDeserializer == deser) {
8181
return this;
8282
}
83-
return new MethodProperty(this, deser, _nullProvider);
83+
// 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were
84+
NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider;
85+
return new MethodProperty(this, deser, nvp);
8486
}
8587

8688
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
5050
if (_valueDeserializer == deser) {
5151
return this;
5252
}
53-
return new ObjectIdReferenceProperty(this, deser, _nullProvider);
53+
// 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were
54+
NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider;
55+
return new ObjectIdReferenceProperty(this, deser, nvp);
5456
}
5557

5658
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
5151
if (_valueDeserializer == deser) {
5252
return this;
5353
}
54-
return new ObjectIdValueProperty(this, deser, _nullProvider);
54+
// 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were
55+
NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider;
56+
return new ObjectIdValueProperty(this, deser, nvp);
5557
}
5658

5759
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
6464
if (_valueDeserializer == deser) {
6565
return this;
6666
}
67-
return new SetterlessProperty(this, deser, _nullProvider);
67+
// 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were
68+
NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider;
69+
return new SetterlessProperty(this, deser, nvp);
6870
}
6971

7072
@Override

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ public AtomicReferenceDeserializer withResolved(TypeDeserializer typeDeser, Json
3737
return new AtomicReferenceDeserializer(_fullType, _valueInstantiator,
3838
typeDeser, valueDeser);
3939
}
40+
4041
@Override
41-
public AtomicReference<Object> getNullValue(DeserializationContext ctxt) {
42-
return new AtomicReference<Object>();
42+
public AtomicReference<Object> getNullValue(DeserializationContext ctxt) throws JsonMappingException {
43+
return new AtomicReference<Object>(_valueDeserializer.getNullValue(ctxt));
4344
}
4445

4546
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ protected abstract ReferenceTypeDeserializer<T> withResolved(TypeDeserializer ty
118118
JsonDeserializer<?> valueDeser);
119119

120120
@Override
121-
public abstract T getNullValue(DeserializationContext ctxt);
121+
public abstract T getNullValue(DeserializationContext ctxt) throws JsonMappingException;
122122

123123
@Override
124-
public Object getEmptyValue(DeserializationContext ctxt) {
124+
public Object getEmptyValue(DeserializationContext ctxt) throws JsonMappingException {
125125
return getNullValue(ctxt);
126126
}
127127

src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesTest.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesDeserTest.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
import com.fasterxml.jackson.annotation.*;
88
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.fasterxml.jackson.databind.ObjectReader;
910
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1011
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
1112

12-
public class JDKAtomicTypesTest
13+
public class JDKAtomicTypesDeserTest
1314
extends com.fasterxml.jackson.databind.BaseMapTest
1415
{
1516
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@@ -93,6 +94,11 @@ static class Issue1256Bean {
9394
public AtomicReference<Object> b = new AtomicReference<Object>();
9495
}
9596

97+
// [databind#2303]
98+
static class MyBean2303 {
99+
public AtomicReference<AtomicReference<Integer>> refRef;
100+
}
101+
96102
/*
97103
/**********************************************************
98104
/* Test methods
@@ -271,11 +277,25 @@ public void testEmpty1256() throws Exception
271277
@SuppressWarnings("unchecked")
272278
public void testNullValueHandling() throws Exception
273279
{
274-
ObjectMapper mapper = new ObjectMapper();
275280
AtomicReference<Double> inputData = new AtomicReference<Double>();
276-
String json = mapper.writeValueAsString(inputData);
277-
AtomicReference<Double> readData = (AtomicReference<Double>) mapper.readValue(json, AtomicReference.class);
281+
String json = MAPPER.writeValueAsString(inputData);
282+
AtomicReference<Double> readData = (AtomicReference<Double>) MAPPER.readValue(json, AtomicReference.class);
278283
assertNotNull(readData);
279284
assertNull(readData.get());
280285
}
286+
287+
// [databind#2303]
288+
public void testNullWithinNested() throws Exception
289+
{
290+
final ObjectReader r = MAPPER.readerFor(MyBean2303.class);
291+
MyBean2303 intRef = r.readValue(" {\"refRef\": 2 } ");
292+
assertNotNull(intRef.refRef);
293+
assertNotNull(intRef.refRef.get());
294+
assertEquals(intRef.refRef.get().get(), new Integer(2));
295+
296+
MyBean2303 nullRef = r.readValue(" {\"refRef\": null } ");
297+
assertNotNull(nullRef.refRef);
298+
assertNotNull(nullRef.refRef.get());
299+
assertNull(nullRef.refRef.get().get());
300+
}
281301
}

0 commit comments

Comments
 (0)