JSON-Bindung für Datums-, Zeit- 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]
java.time.Instant { "epochSecond":726213720, "nano":0 } 1993-02-05T06:02:00Z
java.time.LocalDate { "year":1993, "month":"FEBRUARY", "dayOfMonth":5, ... } 1993-02-05

Diese Regel markiert JAX-RS-Ressourcenmethoden, die JSON-Daten der folgenden Typen erzeugen oder verwenden:

Methoden, die einen der zuvor aufgelisteten Typen erzeugen oder verwenden, müssen konvertiert werden. Beachten Sie, dass auch alle Methoden, die ein Objekt erzeugen oder verwenden, das eines dieser Typen enthält, bearbeitet werden müssen.

Der Binärscanner erkennt nur Methoden, die die zuvor erwähnten Typen direkt erzeugen oder verwenden. Wenn eine Methode jedoch ein Objekt erzeugt oder verwendet, das diese Typen enthält, erkennt der Binärscanner die Typverwendung nicht. Wenn Sie den Binärscanner verwenden, überprüfen Sie alle @javax.ws.rs.Produces- und @javax.ws.rs.Consumes-Annotationen, die JSON oder Platzhalter angeben, und stellen Sie sicher, dass alle Methoden, die Objekte erzeugen oder verwenden, die alle zutreffenden Typen enthalten, konvertiert werden.

Im Folgenden sehen Sie ein Beispiel für JAX-RS-Ressourcenmethoden, die von dieser Regel markiert werden:

@Path("/")
@ApplicationScoped
Allgemein zugängliche Klasse MyService {

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON) public Datum getDate() {
        //...
    }

    @GET
    @Path("/set")
    @Consumes(MediaType.APPLICATION_JSON) public void setDate(Datum Datum) {
        //...
    } }

Für JAX-RS-Ressourcen, die java.util.Date oder java.util.Calendar direkt zurückgeben, muss der Rückgabetyp in long geändert werden, damit dieselbe Ausgabe wie bei Jackson verwendet wird. Angenommen, eine Methode gibt ein Objekt des Typs Date wie das folgende zurück:

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON) public Datum getDate() {
        return new Date(...);
    }

In diesem Fall kann die Methode wie folgt geändert werden:

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON) public lang getDate() {
        return new Date(...).getTime();
    }

Für die Typen java.time.LocalDate und java.time.Instant ist die Anpassung von Code, der das Datum nutzt, an das JSON-B/Yasson-Format einfacher.

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.