Skip to content

Commit dbf3e58

Browse files
committed
Convert SQL Timestamp to LocalDateTime to allow custom formatters
1 parent 66bef09 commit dbf3e58

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/main/java/org/eclipse/yasson/internal/serializer/types/SqlTimestampSerializer.java

+8
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
import java.sql.Timestamp;
1616
import java.time.Instant;
17+
import java.time.LocalDateTime;
1718
import java.time.format.DateTimeFormatter;
19+
import java.time.temporal.TemporalAccessor;
1820
import java.util.Locale;
1921

2022
/**
@@ -31,6 +33,12 @@ class SqlTimestampSerializer extends AbstractDateSerializer<Timestamp> {
3133
super(serializerBuilder);
3234
}
3335

36+
@Override
37+
protected TemporalAccessor toTemporalAccessor(Timestamp value) {
38+
// convert SQL Timestamp into a LocalDateTime to unlock TemporalAccessor access
39+
return LocalDateTime.ofInstant(value.toInstant(), UTC);
40+
}
41+
3442
@Override
3543
protected Instant toInstant(Timestamp value) {
3644
return value.toInstant();

src/test/java/org/eclipse/yasson/serializers/SerializersTest.java

+16-5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.lang.reflect.ParameterizedType;
1717
import java.lang.reflect.Type;
1818
import java.math.BigDecimal;
19+
import java.sql.Timestamp;
1920
import java.util.ArrayList;
2021
import java.util.Arrays;
2122
import java.util.Calendar;
@@ -163,7 +164,7 @@ public void testDeserializerDeserializationByType() {
163164
JsonbConfig config = new JsonbConfig().withDeserializers(new CrateDeserializer());
164165
Jsonb jsonb = JsonbBuilder.create(config);
165166

166-
Box box = createPojoWithDates();
167+
Box box = createPojoWithDates(getExpectedDate());
167168

168169
String expected = "{\"boxStr\":\"Box string\",\"crate\":{\"crateInner\":{\"crateInnerBigDec\":10,\"crate_inner_str\":\"Single inner\",\"date\":\"14.05.2015 || 11:10:01\"},\"crateInnerList\":[{\"crateInnerBigDec\":10,\"crate_inner_str\":\"List inner 0\"},{\"crateInnerBigDec\":10,\"crate_inner_str\":\"List inner 1\"}],\"date\":\"2015-05-14T11:10:01\"},\"secondBoxStr\":\"Second box string\"}";
169170

@@ -250,13 +251,19 @@ private static Date getExpectedDate() {
250251
return new Calendar.Builder().setDate(2015, 4, 14).setTimeOfDay(11, 10, 1).setTimeZone(TimeZone.getTimeZone("Z")).build().getTime();
251252
}
252253

254+
@Test
255+
public void testSqlTimestampSerialization() {
256+
Box box = createPojoWithTimestamp(new Timestamp(getExpectedDate().getTime()));
257+
assertTrue(defaultJsonb.toJson(box).contains("\"timestamp\":\"05/14/2015 @ 11:10\""));
258+
}
259+
253260
@Test
254261
public void testSerializationUsingConversion() {
255262
JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializerWithConversion());
256263
Jsonb jsonb = JsonbBuilder.create(config);
257264

258265
String json = "{\"boxStr\":\"Box string\",\"crate\":{\"crateStr\":\"REPLACED crate str\",\"crateInner\":{\"crateInnerBigDec\":10,\"crate_inner_str\":\"Single inner\",\"date\":\"14.05.2015 || 11:10:01\"},\"crateInnerList\":[{\"crateInnerBigDec\":10,\"crate_inner_str\":\"List inner 0\"},{\"crateInnerBigDec\":10,\"crate_inner_str\":\"List inner 1\"}],\"crateBigDec\":54321,\"date-converted\":\"2015-05-14T11:10:01Z[UTC]\"},\"secondBoxStr\":\"Second box string\"}";
259-
assertEquals(json, jsonb.toJson(createPojoWithDates()));
266+
assertEquals(json, jsonb.toJson(createPojoWithDates(getExpectedDate())));
260267
}
261268

262269
@Test
@@ -567,8 +574,13 @@ public void setStringProperty(String stringProperty) {
567574
}
568575
}
569576

570-
private static Box createPojoWithDates() {
571-
Date date = getExpectedDate();
577+
private static Box createPojoWithTimestamp(Timestamp timestamp) {
578+
Box box = createPojo();
579+
box.crate.timestamp = timestamp;
580+
return box;
581+
}
582+
583+
private static Box createPojoWithDates(Date date) {
572584
Box box = createPojo();
573585
box.crate.date = date;
574586
box.crate.crateInner.date = date;
@@ -581,7 +593,6 @@ private static Box createPojo() {
581593
box.crate = new Crate();
582594
box.secondBoxStr = "Second box string";
583595

584-
585596
box.crate.crateInner = createCrateInner("Single inner");
586597

587598
box.crate.crateInnerList = new ArrayList<>();

src/test/java/org/eclipse/yasson/serializers/model/Crate.java

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import jakarta.json.bind.annotation.JsonbProperty;
1717
import jakarta.json.bind.annotation.JsonbTypeSerializer;
1818
import java.math.BigDecimal;
19+
import java.sql.Timestamp;
1920
import java.util.Date;
2021
import java.util.List;
2122

@@ -36,6 +37,9 @@ public class Crate {
3637
@JsonbDateFormat("dd.MM.yyy ^ HH:mm:ss")
3738
public Date date;
3839

40+
@JsonbDateFormat("MM/dd/yyy @ HH:mm")
41+
public Timestamp timestamp;
42+
3943
public AnnotatedWithSerializerType annotatedType;
4044

4145
public AnnotatedGenericWithSerializerType<Crate> annotatedGenericType;

0 commit comments

Comments
 (0)