Skip to content

Commit 3e482ef

Browse files
committed
Convert SQL Timestamp to LocalDateTime to allow custom formatters
1 parent 6e7ec79 commit 3e482ef

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

Lines changed: 8 additions & 0 deletions
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

Lines changed: 16 additions & 5 deletions
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;
@@ -161,7 +162,7 @@ public void testDeserializerDeserializationByType() {
161162
JsonbConfig config = new JsonbConfig().withDeserializers(new CrateDeserializer());
162163
Jsonb jsonb = JsonbBuilder.create(config);
163164

164-
Box box = createPojoWithDates();
165+
Box box = createPojoWithDates(getExpectedDate());
165166

166167
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\"}";
167168

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

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

256263
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\"}";
257-
assertEquals(json, jsonb.toJson(createPojoWithDates()));
264+
assertEquals(json, jsonb.toJson(createPojoWithDates(getExpectedDate())));
258265
}
259266

260267
@Test
@@ -565,8 +572,13 @@ public void setStringProperty(String stringProperty) {
565572
}
566573
}
567574

568-
private static Box createPojoWithDates() {
569-
Date date = getExpectedDate();
575+
private static Box createPojoWithTimestamp(Timestamp timestamp) {
576+
Box box = createPojo();
577+
box.crate.timestamp = timestamp;
578+
return box;
579+
}
580+
581+
private static Box createPojoWithDates(Date date) {
570582
Box box = createPojo();
571583
box.crate.date = date;
572584
box.crate.crateInner.date = date;
@@ -579,7 +591,6 @@ private static Box createPojo() {
579591
box.crate = new Crate();
580592
box.secondBoxStr = "Second box string";
581593

582-
583594
box.crate.crateInner = createCrateInner("Single inner");
584595

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

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

Lines changed: 4 additions & 0 deletions
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)