Skip to content

Commit 5d68bfa

Browse files
committed
Convert SQL Timestamp to LocalDateTime to allow custom formatters
1 parent 9d6aad9 commit 5d68bfa

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-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

+17-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;
@@ -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,20 @@ 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+
256+
assertTrue(defaultJsonb.toJson(box).contains("\"timestamp\":\"05/14/2015 @ 14:10\""));
257+
}
258+
251259
@Test
252260
public void testSerializationUsingConversion() {
253261
JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializerWithConversion());
254262
Jsonb jsonb = JsonbBuilder.create(config);
255263

256264
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()));
265+
assertEquals(json, jsonb.toJson(createPojoWithDates(getExpectedDate())));
258266
}
259267

260268
@Test
@@ -565,8 +573,13 @@ public void setStringProperty(String stringProperty) {
565573
}
566574
}
567575

568-
private static Box createPojoWithDates() {
569-
Date date = getExpectedDate();
576+
private static Box createPojoWithTimestamp(Timestamp timestamp) {
577+
Box box = createPojo();
578+
box.crate.timestamp = timestamp;
579+
return box;
580+
}
581+
582+
private static Box createPojoWithDates(Date date) {
570583
Box box = createPojo();
571584
box.crate.date = date;
572585
box.crate.crateInner.date = date;
@@ -579,7 +592,6 @@ private static Box createPojo() {
579592
box.crate = new Crate();
580593
box.secondBoxStr = "Second box string";
581594

582-
583595
box.crate.crateInner = createCrateInner("Single inner");
584596

585597
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)