Legarea JSON pentru tipurile de dată, oră şi calendar trebuie să fie convertită

În JAX-RS 2.1, biblioteca internă folosită pentru serializare şi deserializare între obiecte JSON şi Java a fost schimbată de la Jackson la Yasson. Yasson este implementarea de referinţă pentru JSON-B. Jackson şi Yasson vor serializa obiectele legate de timp în moduri diferite, de exemplu:

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 { "an":1993, "luna":"FEBRUARY", "dayOfMonth":5, ... } 1993-02-05

Această regulă semnalează metodele resursei JAX-RS care produc sau consumă date tip JSON de următoarele tipuri:

Metodele care produc sau consumă oricare dintre tipurile listate anterior trebuie să fie convertite. Reţineţi că trebuie să fie tratate şi metodele care produc sau consumă un obiect ce conţine oricare dintre aceste tipuri.

Scanerul de binare detectează numai metodele care consumă sau produc direct tipurile menţionate anterior. Dacă o metodă consumă sau produce un obiect ce conţine aceste tipuri, scanerul de binare nu va detecta utilizarea tipului respectiv. Dacă folosiţi scanerul de binare, examinaţi toate adnotările @javax.ws.rs.Produces şi @javax.ws.rs.Consumes care specifică JSON sau un metacaracter şi asiguraţi-vă că sunt convertite toate metodele care produc sau consumă obiecte ce conţin tipurile aplicabile.

Următorul este un exemplu de metode de resursă JAX-RS care vor fi semnalate de această regulă:

@Path("/")
@ApplicationScoped
clasă publică MyService {

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

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

Pentru metodele de resurse JAX-RS care returnează direct java.util.Date sau java.util.Calendar, tipul de returnare ar trebui să fie schimbat la tipul long pentru a menţine aceeaşi ieşire ca Jackson. De exemplu, dacă o metodă returnează un obiect Date aşa cum aici:

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

Metoda poate fi modificată la următoarele:

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

Pentru tipurile java.time.LocalDate şi java.time.Instant, va fi mai simplu să ajustaţi codul care foloseşte data astfel încât să lucreze cu formatul JSON-B/Yasson.

Pentru mai multe detalii despre diferenţele de comportament dintre Jackson şi Yasson, vedeţi articolul Is it time for a JSON binding standard? care compară comportamentul Jackson şi JSON-B.