JSON-Bindung für Datums- und Kalendertypen muss konvertiert werden

In JAX-RS 2.1 wurde die für die Serialisierung und Entserialisierung von JSON- und Java-Objekten verwendete interne Bibliothek von Jackson auf Yasson umgestellt. Yasson ist die Referenzimplementierung von JSON-B. Jackson und Yasson serialisieren zeitbezogene Objekte auf verschiedene Arten, z. B.:

Jackson Yasson
java.util.Date 726213720000 1993-02-05T06:02:00Z[UTC]
java.util.Calendar 726213720000 1993-02-05T00:00:00-06:00[America/Chicago]

Es können alle JAX-RS-Ressourcenmethoden, die JSON-Daten erzeugen oder verarbeiten, betroffen sein. Diese Regel markiert alle java.util.Date- und java.util.Calendar-Felder, die in einem Objekt enthalten sind, das von einer JAX-RS-Ressourcenmethode erzeugt oder verwendet wird.

Im Folgenden sehen Sie ein Beispiel für JAX-RS-Ressourcenmethoden, die ein Java-Objekt erzeugen oder verwenden, das ein java.util.Date- oder java.util.Calendar-Feld enthält:

@Path("/")
@ApplicationScoped
public class MyService {

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public DataObject getData() {
//...
}

@GET
@Path("/set")
@Consumes(MediaType.APPLICATION_JSON)
public void setData(DataObject data) {
//...
}
}
import java.util.Calendar;
import java.util.Date;

public class DataObject {
public Date juDate;
public Calendar juCalendar;
}

Die Regel markiert die java.util.Date- und java.util.Calendar-Felder im DataObject-Objekt. Im Quellenscanner ist eine Schnellkorrektur für diese Regel verfügbar. Die Schnellkorrektur fügt den Feldern den Code @JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS) hinzu, der die Ausgabe in Epochenmillisekunden konvertieren. Nach der Ausführung der Schnellkorrektur wird die DataObject-Klasse wie folgt geändert:

import java.util.Calendar;
import java.util.Date;
import javax.json.bind.annotation.JsonbDateFormat;

public class DataObject {
@JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS)
public Date juDate;
@JsonbDateFormat(value = JsonbDateFormat.TIME_IN_MILLIS)
public Calendar juCalendar;
}

Anmerkung: Um auf die Annotation @javax.json.bind.annotation.JsonbDateFormat zuzugreifen, die von der Schnellkorrektur hinzugefügt wird, müssen Sie das Feature jsonb in Ihrer Liberty-Konfigurationsdatei server.xml hinzufügen. Fügen Sie beispielsweise das Feature jsonb-1.0 hinzu, wenn Sie das Feature jaxrs-2.1 verwenden.

Weitere Einzelheiten zu den Verhaltensunterschieden zwischen Jackson und Yasson finden Sie im Artikel Is it time for a JSON binding standard? zum Verhaltensvergleich von Jackson und JSON-B.