From 337b53bcb90a7207c5066165f31d9cff365cad9e Mon Sep 17 00:00:00 2001 From: lvydra Date: Mon, 16 Jun 2025 12:39:16 +0200 Subject: [PATCH] [655] java.sql.Time throws java.lang.UnsupportedOperationException when serialized --- .../serializer/types/SqlDateSerializer.java | 2 +- .../yasson/serializers/SerializersTest.java | 14 ++++++++++ .../yasson/serializers/model/SqlTimeBean.java | 28 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/eclipse/yasson/serializers/model/SqlTimeBean.java diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/types/SqlDateSerializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/types/SqlDateSerializer.java index aad680fb4..684511dcf 100644 --- a/src/main/java/org/eclipse/yasson/internal/serializer/types/SqlDateSerializer.java +++ b/src/main/java/org/eclipse/yasson/internal/serializer/types/SqlDateSerializer.java @@ -28,7 +28,7 @@ class SqlDateSerializer extends DateSerializer { @Override protected Instant toInstant(Date value) { - if (value instanceof java.sql.Date) { + if (value instanceof java.sql.Date || value instanceof java.sql.Time) { // java.sql.Date doesn't have a time component, so do our best if TIME_IN_MILLIS is requested // In the future (at a breaking change boundary) we should probably reject this code path return Instant.ofEpochMilli(value.getTime()); diff --git a/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java b/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java index db0efdf18..fdae9a6eb 100644 --- a/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java +++ b/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java @@ -69,6 +69,7 @@ import org.eclipse.yasson.serializers.model.RecursiveSerializer; import org.eclipse.yasson.serializers.model.SimpleAnnotatedSerializedArrayContainer; import org.eclipse.yasson.serializers.model.SimpleContainer; +import org.eclipse.yasson.serializers.model.SqlTimeBean; import org.eclipse.yasson.serializers.model.StringWrapper; import org.eclipse.yasson.serializers.model.SupertypeSerializerPojo; import org.junit.jupiter.api.Test; @@ -201,6 +202,19 @@ public void testSerializerSerializationOfType() { assertEquals(pojo.crate.crateInner.crateInnerBigDec, result.crate.crateInner.crateInnerBigDec); } + @Test + public void testSerializerSerializationOfSqlTime() { + JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializer()); + Jsonb jsonb = JsonbBuilder.create(config); + String expected = "{\"time\":\"1970-01-01T11:00:00Z[UTC]\"}"; + + SqlTimeBean value = new SqlTimeBean(); + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + value.setTime(java.sql.Time.valueOf("11:00:00")); + + assertEquals(expected, jsonb.toJson(value)); + } + @Test public void testSerializerSerializationOfTypeWithExplicitType() { JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializer()); diff --git a/src/test/java/org/eclipse/yasson/serializers/model/SqlTimeBean.java b/src/test/java/org/eclipse/yasson/serializers/model/SqlTimeBean.java new file mode 100644 index 000000000..4ff2ac66a --- /dev/null +++ b/src/test/java/org/eclipse/yasson/serializers/model/SqlTimeBean.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025 Red Hat, Inc. and/or its affiliates. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, + * or the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + */ + +package org.eclipse.yasson.serializers.model; + +import java.sql.Time; + +public class SqlTimeBean { + + private java.sql.Time time; + + public Time getTime() { + return time; + } + + public void setTime(Time time) { + this.time = time; + } +}