Vazba JSON pro typy data, času a kalendáře musí být převedena

V rozhraní JAX-RS 2.1 se interní knihovna používaná pro serializaci a deserializaci mezi objekty JSON a objekty Java změnila z Jackson na Yasson. Yasson je implementace odkazů JSON-B. Jackson a Yasson budou serializovat objekty související s časem různými způsoby, např.:

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

Toto pravidlo označí metody prostředku JAX-RS, které produkují nebo spotřebovávají data typu JSON následujících typů:

Metody, které produkují nebo spotřebovávají některý z typů uvedených dříve, musí být převedeny. Všimněte si, že všechny metody, které produkují nebo spotřebovávají objekt obsahující některý z těchto typů, budou také muset být adresovány.

Binární skener pouze zjišťuje metody, které spotřebovávají nebo produkují dříve uvedené typy přímo. Pokud však metoda spotřebovává nebo produkuje objekt, který obsahuje tyto typy, binární skener nezjistí použití typu. Používáte-li binární skener, zkontrolujte všechny anotace @javax.ws.rs.Produces a @javax.ws.rs.Consumes, které určují JSON nebo zástupný znak, a ujistěte se, že jsou převedeny všechny metody produkující nebo spotřebovávající objekty s některým z použitelných typů.

Dále je uveden příklad metod prostředku JAX-RS, které budou označeny tímto pravidlem:

@Path("/")
@ApplicationScoped
veřejná třída MyService {

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

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

U metod prostředků JAX-RS, které přímo vracejí java.util.Date nebo java.util.Calendar, by se měl návratový typ změnit na typ long, aby byl zachován stejný výstup jako Jackson. Pokud např. metoda vrací objekt Date, jak je uvedeno zde:

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

Metodu lze změnit na následující:

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

Pro typy java.time.LocalDate a java.time.Instant bude jednodušší upravit kód, který spotřebuje datum tak, že zpracuje formát JSON-B/Yasson.

Další podrobnosti o rozdílech v chování mezi Jackson a Yason viz článek Je čas na standard vazby JSON? porovnávající chování Jackson a JSON-B.