È necessario convertire il bind JSON dei tipi data, ora e calendario

In JAX-RS 2.1, la libreria interna utilizzata per la serializzazione e la deserializzazione tra gli oggetti JSON e Java è stata modificata da Jackson a Yasson. Yasson è l'implementazione di riferimento di JSON-B. Jackson e Yasson serializzeranno gli oggetti correlati al tempo in diversi modi, ad esempio:

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

Questa regola contrassegna i metodi delle risorse JAX-RS che producono o consumano dati di tipo JSON dei seguenti tipi:

I metodi che producono o utilizzano uno dei tipi precedentemente elencati devono essere convertiti. Si noti che anche tutti i metodi che producono o consumano un oggetto contenente uno di questi tipi dovranno essere indirizzati.

Lo scanner binario rileva solo i metodi che utilizzano o producono direttamente i tipi precedentemente indicati. Tuttavia, se un metodo consuma o produce un oggetto che contiene tali tipi, lo scanner binario non individuerà l'utilizzo del tipo. Se si sta utilizzando lo scanner binario, riesaminare tutte le annotazioni @javax.ws.rs.Produces e @javax.ws.rs.Consumes che specificano JSON o wildcard e assicurarsi che qualsiasi metodo che produce o consuma oggetti contenenti uno qualsiasi dei tipi applicabili sia convertito.

Di seguito viene riportato un esempio di metodi della risorsa JAX-RS che verranno contrassegnati da questa regola:

@Path("/")
@ApplicationScoped
Classe pubblica MyService {

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

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

Per i metodi della risorsa JAX-RS che restituiscono direttamente java.util.Date o java.util.Calendar, il tipo di restituzione deve essere modificato in long per mantenere lo stesso output di Jackson. Ad esempio, se un metodo restituisce un oggetto Date come visualizzato qui:

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

Il metodo può essere modificato nel seguente:

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

Per i tipi java.time.LocalDate e java.time.Instant, sarà più semplice adattare il codice che utilizza la data in modo che gestisca il formato JSON-B/Yasson.

Per ulteriori dettagli sulle differenze di comportamento tra Jackson e Yasson, consultare l'articolo Is it time for a JSON binding standard? che confronta il comportamento di Jackson e JSON-B.