Skip to content

Commit 06a8184

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

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,18 @@
1414

1515
import java.time.Instant;
1616
import java.time.format.DateTimeFormatter;
17+
import java.time.temporal.UnsupportedTemporalTypeException;
1718
import java.util.Date;
1819
import java.util.Locale;
20+
import java.util.logging.Logger;
1921

2022
/**
2123
* Common serializer for {@link Date} and {@link java.sql.Date} types.
2224
*/
2325
class SqlDateSerializer extends DateSerializer<Date> {
2426

27+
private static final Logger LOGGER = Logger.getLogger(SqlDateSerializer.class.getName());
28+
2529
SqlDateSerializer(TypeSerializerBuilder serializerBuilder) {
2630
super(serializerBuilder);
2731
}
@@ -49,9 +53,12 @@ protected String formatDefault(Date value, Locale locale) {
4953
@Override
5054
protected String formatWithFormatter(Date value, DateTimeFormatter formatter) {
5155
if (value instanceof java.sql.Date) {
52-
return ((java.sql.Date) value).toLocalDate().format(formatter);
53-
} else {
54-
return super.formatWithFormatter(value, formatter);
56+
try {
57+
return ((java.sql.Date) value).toLocalDate().format(formatter);
58+
} catch (UnsupportedTemporalTypeException exception) {
59+
LOGGER.warning(exception.getMessage());
60+
}
5561
}
62+
return super.formatWithFormatter(value, formatter);
5663
}
5764
}

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)