Skip to content
This repository was archived by the owner on Nov 7, 2019. It is now read-only.

Commit 9de9beb

Browse files
committed
Allow users of the api to pass in a custom formatter to the LocalDateTimeSerializer/Deserializer.
1 parent c514fc2 commit 9de9beb

File tree

3 files changed

+75
-10
lines changed

3 files changed

+75
-10
lines changed

src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ private LocalDateTimeDeserializer() {
4242
this(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
4343
}
4444

45-
protected LocalDateTimeDeserializer(DateTimeFormatter dtf) {
46-
super(LocalDateTime.class, dtf);
45+
public LocalDateTimeDeserializer(DateTimeFormatter formatter) {
46+
super(LocalDateTime.class, formatter);
4747
}
4848

4949
@Override
50-
protected JsonDeserializer<LocalDateTime> withDateFormat(DateTimeFormatter dtf) {
51-
return new LocalDateTimeDeserializer(dtf);
50+
protected JsonDeserializer<LocalDateTime> withDateFormat(DateTimeFormatter formatter) {
51+
return new LocalDateTimeDeserializer(formatter);
5252
}
5353

5454
@Override

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,20 @@ public class LocalDateTimeSerializer extends JSR310FormattedSerializerBase<Local
3838
public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer();
3939

4040
protected LocalDateTimeSerializer() {
41-
super(LocalDateTime.class);
41+
this(null);
4242
}
4343

44-
private LocalDateTimeSerializer(LocalDateTimeSerializer base,
45-
Boolean useTimestamp, DateTimeFormatter dtf) {
46-
super(base, useTimestamp, dtf);
44+
public LocalDateTimeSerializer(DateTimeFormatter formatter) {
45+
super(LocalDateTime.class, formatter);
46+
}
47+
48+
private LocalDateTimeSerializer(LocalDateTimeSerializer base, Boolean useTimestamp, DateTimeFormatter formatter) {
49+
super(base, useTimestamp, formatter);
4750
}
4851

4952
@Override
50-
protected JSR310FormattedSerializerBase<LocalDateTime> withFormat(Boolean useTimestamp, DateTimeFormatter dtf) {
51-
return new LocalDateTimeSerializer(this, useTimestamp, dtf);
53+
protected JSR310FormattedSerializerBase<LocalDateTime> withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
54+
return new LocalDateTimeSerializer(this, useTimestamp, formatter);
5255
}
5356

5457
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.fasterxml.jackson.datatype.jsr310;
2+
3+
import static org.hamcrest.core.IsEqual.equalTo;
4+
import static org.junit.Assert.assertThat;
5+
import static org.junit.internal.matchers.StringContains.containsString;
6+
7+
import com.fasterxml.jackson.databind.ObjectMapper;
8+
import com.fasterxml.jackson.databind.module.SimpleModule;
9+
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
10+
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
11+
import org.junit.Test;
12+
import org.junit.runner.RunWith;
13+
import org.junit.runners.Parameterized;
14+
import org.junit.runners.Parameterized.Parameters;
15+
16+
import java.text.SimpleDateFormat;
17+
import java.time.LocalDate;
18+
import java.time.LocalDateTime;
19+
import java.time.ZoneId;
20+
import java.time.format.DateTimeFormatter;
21+
import java.time.format.DateTimeFormatterBuilder;
22+
import java.util.ArrayList;
23+
import java.util.Collection;
24+
25+
@RunWith(Parameterized.class)
26+
public class TestLocalDateTimeSerializationWithCustomFormatter {
27+
private final DateTimeFormatter formatter;
28+
29+
public TestLocalDateTimeSerializationWithCustomFormatter(DateTimeFormatter formatter) {
30+
this.formatter = formatter;
31+
}
32+
33+
@Test
34+
public void testSerialization() throws Exception {
35+
LocalDateTime dateTime = LocalDateTime.now();
36+
assertThat("Failed to serialize with " + formatter, serializeWith(dateTime, formatter), containsString(dateTime.format(formatter)));
37+
}
38+
39+
private String serializeWith(LocalDateTime dateTime, DateTimeFormatter formatter) throws Exception {
40+
ObjectMapper mapper = new ObjectMapper().registerModule(new SimpleModule().addSerializer(new LocalDateTimeSerializer(formatter)));
41+
return mapper.writeValueAsString(dateTime);
42+
}
43+
44+
@Test
45+
public void testDeserialization() throws Exception {
46+
LocalDateTime dateTime = LocalDateTime.now();
47+
assertThat(deserializeWith(dateTime.format(formatter), formatter), equalTo(dateTime));
48+
}
49+
50+
private LocalDateTime deserializeWith(String json, DateTimeFormatter formatter) throws Exception {
51+
ObjectMapper mapper = new ObjectMapper().registerModule(new SimpleModule().addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)));
52+
return mapper.readValue("\"" + json + "\"", LocalDateTime.class);
53+
}
54+
55+
@Parameters
56+
public static Collection<Object[]> customFormatters() {
57+
Collection<Object[]> formatters = new ArrayList<>();
58+
formatters.add(new Object[]{DateTimeFormatter.ISO_DATE_TIME});
59+
formatters.add(new Object[]{DateTimeFormatter.ISO_LOCAL_DATE_TIME});
60+
return formatters;
61+
}
62+
}

0 commit comments

Comments
 (0)