Skip to content

Commit 76a5fd1

Browse files
committed
[676] UnsupportedTemporalTypeException when serializing java.sql.Date with formatter containing time component fields
1 parent a2cfd89 commit 76a5fd1

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
package org.eclipse.yasson.internal.serializer.types;
1414

1515
import java.time.Instant;
16+
import java.time.LocalDate;
17+
import java.time.ZoneId;
1618
import java.time.format.DateTimeFormatter;
19+
import java.time.temporal.UnsupportedTemporalTypeException;
1720
import java.util.Date;
1821
import java.util.Locale;
1922

@@ -49,9 +52,22 @@ protected String formatDefault(Date value, Locale locale) {
4952
@Override
5053
protected String formatWithFormatter(Date value, DateTimeFormatter formatter) {
5154
if (value instanceof java.sql.Date) {
52-
return ((java.sql.Date) value).toLocalDate().format(formatter);
55+
LocalDate localDate = ((java.sql.Date) value).toLocalDate();
56+
if (formatterRequiresTimeFields(formatter)) {
57+
return localDate.atStartOfDay(ZoneId.of("UTC")).format(formatter);
58+
}
59+
return localDate.format(formatter);
5360
} else {
5461
return super.formatWithFormatter(value, formatter);
5562
}
5663
}
64+
65+
private boolean formatterRequiresTimeFields(DateTimeFormatter formatter) {
66+
try {
67+
formatter.format(LocalDate.of(2000, 1, 1));
68+
return false;
69+
} catch (UnsupportedTemporalTypeException e) {
70+
return true;
71+
}
72+
}
5773
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import org.eclipse.yasson.serializers.model.RecursiveSerializer;
7070
import org.eclipse.yasson.serializers.model.SimpleAnnotatedSerializedArrayContainer;
7171
import org.eclipse.yasson.serializers.model.SimpleContainer;
72+
import org.eclipse.yasson.serializers.model.SqlDateBean;
7273
import org.eclipse.yasson.serializers.model.StringWrapper;
7374
import org.eclipse.yasson.serializers.model.SupertypeSerializerPojo;
7475
import org.junit.jupiter.api.Test;
@@ -201,6 +202,19 @@ public void testSerializerSerializationOfType() {
201202
assertEquals(pojo.crate.crateInner.crateInnerBigDec, result.crate.crateInner.crateInnerBigDec);
202203
}
203204

205+
@Test
206+
public void testSerializationOfSqlDateWithFormatter() {
207+
JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializer());
208+
Jsonb jsonb = JsonbBuilder.create(config);
209+
String expected = "{\"date\":\"2019-01-26T00:00:00.000+0000\"}";
210+
211+
SqlDateBean value = new SqlDateBean();
212+
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
213+
value.setDate(java.sql.Date.valueOf("2019-01-26"));
214+
215+
assertEquals(expected, jsonb.toJson(value));
216+
}
217+
204218
@Test
205219
public void testSerializerSerializationOfTypeWithExplicitType() {
206220
JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializer());
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) 2025 Red Hat, Inc. and/or its affiliates.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0,
7+
* or the Eclipse Distribution License v. 1.0 which is available at
8+
* http://www.eclipse.org/org/documents/edl-v10.php.
9+
*
10+
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
11+
*/
12+
13+
package org.eclipse.yasson.serializers.model;
14+
15+
import jakarta.json.bind.annotation.JsonbDateFormat;
16+
17+
import java.sql.Date;
18+
19+
public class SqlDateBean {
20+
21+
@JsonbDateFormat(value = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
22+
private java.sql.Date date;
23+
24+
public Date getDate() {
25+
return date;
26+
}
27+
28+
public void setDate(Date date) {
29+
this.date = date;
30+
}
31+
}

0 commit comments

Comments
 (0)