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.