Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@
package org.eclipse.yasson.internal.serializer.types;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.UnsupportedTemporalTypeException;
import java.util.Date;
import java.util.Locale;

Expand Down Expand Up @@ -49,9 +52,22 @@ protected String formatDefault(Date value, Locale locale) {
@Override
protected String formatWithFormatter(Date value, DateTimeFormatter formatter) {
if (value instanceof java.sql.Date) {
return ((java.sql.Date) value).toLocalDate().format(formatter);
LocalDate localDate = ((java.sql.Date) value).toLocalDate();
if (formatterRequiresTimeFields(formatter)) {
return localDate.atStartOfDay(ZoneId.of("UTC")).format(formatter);
}
return localDate.format(formatter);
} else {
return super.formatWithFormatter(value, formatter);
}
}

private boolean formatterRequiresTimeFields(DateTimeFormatter formatter) {
try {
formatter.format(LocalDate.of(2000, 1, 1));
return false;
} catch (UnsupportedTemporalTypeException e) {
return true;
}
}
}
14 changes: 14 additions & 0 deletions src/test/java/org/eclipse/yasson/serializers/SerializersTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.SqlDateBean;
import org.eclipse.yasson.serializers.model.StringWrapper;
import org.eclipse.yasson.serializers.model.SupertypeSerializerPojo;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -201,6 +202,19 @@ public void testSerializerSerializationOfType() {
assertEquals(pojo.crate.crateInner.crateInnerBigDec, result.crate.crateInner.crateInnerBigDec);
}

@Test
public void testSerializationOfSqlDateWithFormatter() {
JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializer());
Jsonb jsonb = JsonbBuilder.create(config);
String expected = "{\"date\":\"2019-01-26T00:00:00.000+0000\"}";

SqlDateBean value = new SqlDateBean();
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
value.setDate(java.sql.Date.valueOf("2019-01-26"));

assertEquals(expected, jsonb.toJson(value));
}

@Test
public void testSerializerSerializationOfTypeWithExplicitType() {
JsonbConfig config = new JsonbConfig().withSerializers(new CrateSerializer());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* 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 jakarta.json.bind.annotation.JsonbDateFormat;

import java.sql.Date;

public class SqlDateBean {

@JsonbDateFormat(value = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private java.sql.Date date;

public Date getDate() {
return date;
}

public void setDate(Date date) {
this.date = date;
}
}