Skip to content

Commit 1ba0b07

Browse files
authored
Solve NPE part of #296 (#298)
1 parent 40750f0 commit 1ba0b07

File tree

8 files changed

+102
-11
lines changed

8 files changed

+102
-11
lines changed

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalDateSerializer.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,12 @@ public void serializeWithType(LocalDate value, JsonGenerator g,
8383
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
8484
typeSer.typeId(value, serializationShape(provider)));
8585
// need to write out to avoid double-writing array markers
86-
switch (typeIdDef.valueShape) {
87-
case START_ARRAY:
86+
JsonToken shape = (typeIdDef == null) ? null : typeIdDef.valueShape;
87+
if (shape == JsonToken.START_ARRAY) {
8888
_serializeAsArrayContents(value, g, provider);
89-
break;
90-
case VALUE_NUMBER_INT:
89+
} else if (shape == JsonToken.VALUE_NUMBER_INT) {
9190
g.writeNumber(value.toEpochDay());
92-
break;
93-
default:
91+
} else {
9492
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));
9593
}
9694
typeSer.writeTypeSuffix(g, typeIdDef);

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalDateTimeSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void serializeWithType(LocalDateTime value, JsonGenerator g, SerializerPr
8686
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
8787
typeSer.typeId(value, serializationShape(provider)));
8888
// need to write out to avoid double-writing array markers
89-
if (typeIdDef.valueShape == JsonToken.START_ARRAY) {
89+
if ((typeIdDef != null) && typeIdDef.valueShape == JsonToken.START_ARRAY) {
9090
_serializeAsArrayContents(value, g, provider);
9191
} else {
9292
DateTimeFormatter dtf = _formatter;

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalTimeSerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ public void serializeWithType(LocalTime value, JsonGenerator g,
9494
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
9595
typeSer.typeId(value, serializationShape(provider)));
9696
// need to write out to avoid double-writing array markers
97-
if (typeIdDef.valueShape == JsonToken.START_ARRAY) {
97+
if ((typeIdDef != null)
98+
&& typeIdDef.valueShape == JsonToken.START_ARRAY) {
9899
_serializeAsArrayContents(value, g, provider);
99100
} else {
100101
DateTimeFormatter dtf = _formatter;

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/MonthDaySerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ public void serializeWithType(MonthDay value, JsonGenerator g,
8181
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
8282
typeSer.typeId(value, serializationShape(provider)));
8383
// need to write out to avoid double-writing array markers
84-
if (typeIdDef.valueShape == JsonToken.START_ARRAY) {
84+
if ((typeIdDef != null)
85+
&& typeIdDef.valueShape == JsonToken.START_ARRAY) {
8586
_serializeAsArrayContents(value, g, provider);
8687
} else {
8788
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/OffsetTimeSerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public void serializeWithType(OffsetTime value, JsonGenerator g, SerializerProvi
7979
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
8080
typeSer.typeId(value, serializationShape(provider)));
8181
// need to write out to avoid double-writing array markers
82-
if (typeIdDef.valueShape == JsonToken.START_ARRAY) {
82+
if ((typeIdDef != null)
83+
&& typeIdDef.valueShape == JsonToken.START_ARRAY) {
8384
_serializeAsArrayContents(value, g, provider);
8485
} else {
8586
String str = (_formatter == null) ? value.toString() : value.format(_formatter);

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/YearMonthSerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ public void serializeWithType(YearMonth value, JsonGenerator g,
8282
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
8383
typeSer.typeId(value, serializationShape(provider)));
8484
// need to write out to avoid double-writing array markers
85-
if (typeIdDef.valueShape == JsonToken.START_ARRAY) {
85+
if ((typeIdDef != null)
86+
&& typeIdDef.valueShape == JsonToken.START_ARRAY) {
8687
_serializeAsArrayContents(value, g, provider);
8788
} else {
8889
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.fasterxml.jackson.datatype.jsr310.misc;
2+
3+
import java.time.*;
4+
5+
import org.junit.Assert;
6+
import org.junit.Test;
7+
8+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import com.fasterxml.jackson.databind.SerializationFeature;
11+
import com.fasterxml.jackson.datatype.jsr310.ModuleTestBase;
12+
13+
// for [modules-java8#296]: problem with `JsonTypeInfo.Id.DEDUCTION`
14+
public class DeductionTypeSerialization296Test extends ModuleTestBase
15+
{
16+
static class Wrapper {
17+
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
18+
public Object value;
19+
20+
public Wrapper(Object value) {
21+
this.value = value;
22+
}
23+
}
24+
25+
private final ObjectMapper MAPPER = mapperBuilder()
26+
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
27+
.build();
28+
29+
@Test
30+
public void testLocalDate() throws Exception
31+
{
32+
LocalDate date = LocalDate.of(1986, Month.JANUARY, 17);
33+
Assert.assertEquals(a2q("{'value':'1986-01-17'}"),
34+
MAPPER.writeValueAsString(new Wrapper(date)));
35+
}
36+
37+
@Test
38+
public void testLocalDateTime() throws Exception
39+
{
40+
LocalDateTime datetime = LocalDateTime.of(2013, Month.AUGUST, 21, 9, 22, 0, 57);
41+
Assert.assertEquals(a2q("{'value':'2013-08-21T09:22:00.000000057'}"),
42+
MAPPER.writeValueAsString(new Wrapper(datetime)));
43+
}
44+
45+
@Test
46+
public void testLocalTime() throws Exception
47+
{
48+
LocalTime time = LocalTime.of(9, 22, 57);
49+
Assert.assertEquals(a2q("{'value':'09:22:57'}"),
50+
MAPPER.writeValueAsString(new Wrapper(time)));
51+
}
52+
53+
@Test
54+
public void testMonthDate() throws Exception
55+
{
56+
MonthDay date = MonthDay.of(Month.JANUARY, 17);
57+
Assert.assertEquals(a2q("{'value':'--01-17'}"),
58+
MAPPER.writeValueAsString(new Wrapper(date)));
59+
}
60+
61+
@Test
62+
public void testOffsetTime() throws Exception
63+
{
64+
OffsetTime time = OffsetTime.of(15, 43, 0, 0, ZoneOffset.of("+0300"));
65+
Assert.assertEquals(a2q("{'value':'15:43+03:00'}"),
66+
MAPPER.writeValueAsString(new Wrapper(time)));
67+
}
68+
69+
@Test
70+
public void testYearMonth() throws Exception
71+
{
72+
YearMonth date = YearMonth.of(1986, Month.JANUARY);
73+
Assert.assertEquals(a2q("{'value':'1986-01'}"),
74+
MAPPER.writeValueAsString(new Wrapper(date)));
75+
}
76+
77+
@Test
78+
public void testZoneId() throws Exception
79+
{
80+
ZoneId zone = ZoneId.of("America/Denver");
81+
Assert.assertEquals(a2q("{'value':'America/Denver'}"),
82+
MAPPER.writeValueAsString(new Wrapper(zone)));
83+
}
84+
}

release-notes/VERSION-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ Modules:
88
=== Releases ===
99
------------------------------------------------------------------------
1010

11+
2.16.2 (not yet released)
12+
13+
#296: NPE when serializing a `LocalDate` or `LocalDateTime` using `AsDeductionTypeSerializer`
14+
(reported by @mike-reynolds-savient)
15+
1116
2.16.1 (24-Dec-2023)
1217

1318
#286: Breaking change in `InstantDeserializer API between 2.15 and 2.16

0 commit comments

Comments
 (0)