Skip to content

Commit 878cd71

Browse files
committed
Fixes #142: handle nulls for RangeSet
1 parent 18834a6 commit 878cd71

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/RangeSetDeserializer.java

+30-2
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
package com.fasterxml.jackson.datatype.guava.deser;
22

3-
import com.fasterxml.jackson.databind.JsonMappingException;
4-
import com.fasterxml.jackson.databind.type.TypeFactory;
53
import java.io.IOException;
64
import java.util.Collection;
75
import java.util.List;
86

7+
import com.fasterxml.jackson.databind.JsonMappingException;
8+
import com.fasterxml.jackson.databind.type.TypeFactory;
9+
910
import com.fasterxml.jackson.core.JsonParser;
11+
import com.fasterxml.jackson.core.JsonToken;
1012
import com.fasterxml.jackson.databind.BeanProperty;
1113
import com.fasterxml.jackson.databind.DeserializationContext;
1214
import com.fasterxml.jackson.databind.JavaType;
1315
import com.fasterxml.jackson.databind.JsonDeserializer;
1416
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
1517
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
1618
import com.fasterxml.jackson.databind.type.LogicalType;
19+
1720
import com.google.common.collect.ImmutableRangeSet;
1821
import com.google.common.collect.Range;
1922
import com.google.common.collect.RangeSet;
@@ -95,10 +98,35 @@ public RangeSet<Comparable<?>> deserialize(JsonParser p, DeserializationContext
9598
final Collection<?> ranges = (Collection<?>) _deserializer.deserialize(p, ctxt);
9699
ImmutableRangeSet.Builder<Comparable<?>> builder = ImmutableRangeSet.builder();
97100
for (Object ob : ranges) {
101+
if (ob == null) {
102+
_tryToAddNull(p, ctxt, builder);
103+
continue;
104+
}
98105
@SuppressWarnings("unchecked")
99106
Range<Comparable<?>> range = (Range<Comparable<?>>) ob;
100107
builder.add(range);
101108
}
102109
return builder.build();
103110
}
111+
112+
/**
113+
* Some/many Guava containers do not allow addition of {@code null} values,
114+
* so isolate handling here.
115+
*
116+
* @since 2.17
117+
*/
118+
protected void _tryToAddNull(JsonParser p, DeserializationContext ctxt,
119+
ImmutableRangeSet.Builder<Comparable<?>> builder)
120+
throws IOException
121+
{
122+
// Ideally we'd have better idea of where nulls are accepted, but first
123+
// let's just produce something better than NPE:
124+
try {
125+
builder.add(null);
126+
} catch (NullPointerException e) {
127+
ctxt.handleUnexpectedToken(_valueType, JsonToken.VALUE_NULL, p,
128+
"Guava `RangeSet` does not accept `null` values");
129+
}
130+
}
131+
104132
}

guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/cache/GuavaCacheDeserializer.java

-1
Original file line numberDiff line numberDiff line change
@@ -186,5 +186,4 @@ protected void _tryToAddNull(JsonParser p, DeserializationContext ctxt,
186186
ClassUtil.classNameOf(cache));
187187
}
188188
}
189-
190189
}

guava/src/test/java/com/fasterxml/jackson/datatype/guava/RangeSetTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.databind.JavaType;
55
import com.fasterxml.jackson.databind.ObjectMapper;
66
import com.fasterxml.jackson.databind.ObjectReader;
7+
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
78
import com.fasterxml.jackson.databind.type.TypeFactory;
89
import com.google.common.collect.ImmutableRangeSet;
910
import com.google.common.collect.Range;
@@ -48,4 +49,17 @@ public void testSerializeDeserializeImmutableRangeSet() throws Exception {
4849
assertEquals(rangeSet, MAPPER.readValue(json, new TypeReference<RangeSet<Integer>>() {}));
4950
assertEquals(rangeSet, MAPPER.readValue(json, new TypeReference<ImmutableRangeSet<Integer>>() {}));
5051
}
52+
53+
// [datatypes-collections#142]: nulls in RangeSet JSON
54+
public void testDeserializeFromNull() throws Exception
55+
{
56+
final String json = a2q("[ {'lowerEndpoint':1,'lowerBoundType':'CLOSED'}, null ]");
57+
try {
58+
RangeSet<?> rs = MAPPER.readValue(json,
59+
new TypeReference<ImmutableRangeSet<Integer>>() {});
60+
fail("Should not pass, got: "+rs);
61+
} catch (MismatchedInputException e) {
62+
verifyException(e, "Guava `RangeSet` does not accept `null` values");
63+
}
64+
}
5165
}

release-notes/VERSION-2.x

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Active Maintainers:
2828
#138 (guava) `GuavaCollectionDeserializer` still throws NPE in some circumstances
2929
(contributed by Arthur C)
3030
#140 (guava) `Cache` deserialization fails with NPE for `null` valued entries
31+
#142 (guava) `RangeSet` deserializer fails for content `null`s with NPE
3132

3233
2.16.0 (15-Nov-2023)
3334

0 commit comments

Comments
 (0)