Merge pull request #754 from KyleAure/spec-record-virtual-attributes

feat: add support for virtual attributes on records
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index e39f36e..c627cdf 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -43,7 +43,7 @@
         with:
           fetch-depth: 0
       - name: Set up compile JDK
-        uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0
+        uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0
         with: #Compile java needs to be the highest to ensure proper compilation of the multi-release jar
           distribution: 'temurin'
           java-version: 17
diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml
index 7977c1f..ec7b4fe 100644
--- a/.github/workflows/performance.yml
+++ b/.github/workflows/performance.yml
@@ -33,7 +33,7 @@
               with:
                 fetch-depth: 0
             - name: Set up compile JDK
-              uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0
+              uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0
               with: #Compile java needs to be the highest to ensure proper compilation of the multi-release jar
                 distribution: 'temurin'
                 java-version: 17
diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml
index fb7b194..829508c 100644
--- a/.github/workflows/verify.yml
+++ b/.github/workflows/verify.yml
@@ -33,7 +33,7 @@
               with:
                 fetch-depth: 0
             - name: Set up compile JDK
-              uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0
+              uses: actions/setup-java@dd06d9cba3e5552c54d9f8ea23572deb30010f7c # v6.0.0
               with: #Compile java needs to be the highest to ensure proper compilation of the multi-release jar
                 distribution: 'temurin'
                 java-version: 17
diff --git a/pom.xml b/pom.xml
index 752bbf0..e07d71e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,11 +62,11 @@
         <!--Plugins-->
         <build-helper-maven-plugin.version>3.6.0</build-helper-maven-plugin.version>
         <buildnumber-maven-plugin.version>3.3.0</buildnumber-maven-plugin.version>
-        <spotbugs-maven-plugin.version>4.10.3.0</spotbugs-maven-plugin.version>
+        <spotbugs-maven-plugin.version>4.10.4.0</spotbugs-maven-plugin.version>
         <glassfish-copyright-maven-plugin.version>2.4</glassfish-copyright-maven-plugin.version>
         <maven-bundle-plugin.version>5.1.9</maven-bundle-plugin.version>
         <maven-checkstyle-plugin.version>3.3.1</maven-checkstyle-plugin.version>
-        <maven-compiler-plugin.version>3.15.0</maven-compiler-plugin.version>
+        <maven-compiler-plugin.version>3.16.0</maven-compiler-plugin.version>
         <maven-enforcer-plugin.version>3.4.1</maven-enforcer-plugin.version>
         <maven-jar-plugin.version>3.4.1</maven-jar-plugin.version>
         <maven-javadoc-plugin.version>3.6.3</maven-javadoc-plugin.version>
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 aad680f..684511d 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 @@
 
     @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/main/resources/yasson-messages.properties b/src/main/resources/yasson-messages.properties
index a059313..244df20 100644
--- a/src/main/resources/yasson-messages.properties
+++ b/src/main/resources/yasson-messages.properties
@@ -82,7 +82,7 @@
 nonParametrizedType=Type: {0} is not a parametrized type.
 propertyNameClash=Property {0} clashes with property {1} by read or write name in class {2}.
 sqlDateIJsonError=java.sql.Date is not supported in STRICT_IJSON mode.
-recursiveReference=Recursive reference has been found in class {0}.
+recursiveReference=Recursive reference has been found in {0}.
 datatypeFactoryCreationFailed=An error occurred while DatatypeFactory creation.
 multipleConstructorPropertiesCreators=More than one constructor annotated with @ConstructorProperties declared in class {0}.
 annotationNotAvailable=Annotation {0} is not visible in modules or classpath. Annotation will be ignored.
diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/specific/RecursiveReferenceTest.java b/src/test/java/org/eclipse/yasson/defaultmapping/specific/RecursiveReferenceTest.java
index b70ae39..67872ab 100644
--- a/src/test/java/org/eclipse/yasson/defaultmapping/specific/RecursiveReferenceTest.java
+++ b/src/test/java/org/eclipse/yasson/defaultmapping/specific/RecursiveReferenceTest.java
@@ -52,7 +52,7 @@
                     "Unable to serialize property 'linksTo' from org.eclipse.yasson.adapters.model.Chain",
                     e.getMessage());
             assertEquals(
-                    "Recursive reference has been found in class class org.eclipse.yasson.adapters.model.Chain.",
+                    "Recursive reference has been found in class org.eclipse.yasson.adapters.model.Chain.",
                     e.getCause().getMessage());
         }
     }
@@ -79,7 +79,7 @@
             userSerializerJsonb.toJson(recursive);
             fail("Exception should be caught");
         } catch (JsonbException e) {
-            assertEquals("Recursive reference has been found in class class org.eclipse.yasson.adapters.model.Chain.",
+            assertEquals("Recursive reference has been found in class org.eclipse.yasson.adapters.model.Chain.",
                          e.getMessage());
         }
     }
diff --git a/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java b/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java
index 21da05b..8214b88 100644
--- a/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java
+++ b/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java
@@ -71,6 +71,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;
@@ -205,6 +206,19 @@
     }
 
     @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());
         Jsonb jsonb = JsonbBuilder.create(config);
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 0000000..4ff2ac6
--- /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;
+    }
+}