Skip to content

Commit 3434dfc

Browse files
committed
Solve NPE part of #296, add test
1 parent 40750f0 commit 3434dfc

File tree

4 files changed

+62
-8
lines changed

4 files changed

+62
-8
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;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.fasterxml.jackson.datatype.jsr310.misc;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.time.LocalTime;
6+
import java.time.Month;
7+
8+
import org.junit.Assert;
9+
import org.junit.Test;
10+
11+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
12+
import com.fasterxml.jackson.databind.ObjectMapper;
13+
import com.fasterxml.jackson.databind.SerializationFeature;
14+
import com.fasterxml.jackson.datatype.jsr310.ModuleTestBase;
15+
16+
// for [modules-java8#296]: problem with `JsonTypeInfo.Id.DEDUCTION`
17+
public class DeductionTypeSerialization296Test extends ModuleTestBase
18+
{
19+
static class Wrapper {
20+
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
21+
public Object value;
22+
23+
public Wrapper(Object value) {
24+
this.value = value;
25+
}
26+
}
27+
28+
private final ObjectMapper MAPPER = mapperBuilder()
29+
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
30+
.build();
31+
32+
@Test
33+
public void testLocalDate() throws Exception
34+
{
35+
LocalDate date = LocalDate.of(1986, Month.JANUARY, 17);
36+
Assert.assertEquals(a2q("{'value':'1986-01-17'}"),
37+
MAPPER.writeValueAsString(new Wrapper(date)));
38+
}
39+
40+
@Test
41+
public void testLocalDateTime() throws Exception
42+
{
43+
LocalDateTime datetime = LocalDateTime.of(2013, Month.AUGUST, 21, 9, 22, 0, 57);
44+
Assert.assertEquals(a2q("{'value':'2013-08-21T09:22:00.000000057'}"),
45+
MAPPER.writeValueAsString(new Wrapper(datetime)));
46+
}
47+
48+
@Test
49+
public void testLocalTime() throws Exception
50+
{
51+
LocalTime time = LocalTime.of(9, 22, 57);
52+
Assert.assertEquals(a2q("{'value':'09:22:57'}"),
53+
MAPPER.writeValueAsString(new Wrapper(time)));
54+
}
55+
}

0 commit comments

Comments
 (0)