El enlace JSON para los tipos de fecha, hora y calendario debe convertirse

En JAX-RS 2.1, la biblioteca interna utilizada para la serialización y la deserialización entre objetos JSON y Java ha cambiado de Jackson a Yasson. Yasson es la implementación de referencia de JSON-B. Jackson y Yasson serializarán los objetos relacionados con el tiempo de distintas formas, por ejemplo:

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

Esta regla señala los métodos de recurso JAX-RS que generan o consumen datos del tipo JSON de los tipos siguientes:

Los métodos que generan o consumen alguno de los tipos listados anteriormente se deben convertir. Tenga en cuenta que cualquier método que genera o consume un objeto que contenga alguno de estos tipos también se tendrá que solucionar.

El escáner binario solo detecta los métodos que consumen o generan los tipos mencionados anteriormente de forma directa. Sin embargo, si un método consume o genera un objeto que contiene estos tipos, el escáner binario no detectará el uso del tipo. Si está utilizando el escáner binario, revise todas las anotaciones @javax.ws.rs.Produces y @javax.ws.rs.Consumes que especifiquen JSON o caracteres comodín y asegúrese de que se han convertido los métodos que generan o consumen objetos que contienen alguno de los tipos aplicables.

A continuación se muestra un ejemplo de los métodos de recursos JAX-RS que esta regla marcará:

@Path("/")
@ApplicationScoped
clase pública MyService {

    @GET
    @Path("/obtener")
    @Produces(MediaType.APPLICATION_JSON) public Fecha getDate() {
        //...
    }

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

Para los métodos de recursos JAX-RS que devuelven directamente java.util.Date o java.util.Calendar, el tipo de retorno debe cambiarse al tipo long para mantener la misma salida que Jackson. Por ejemplo, si un método devuelve un objeto Date como se ve a continuación:

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

Se puede cambiar el método a lo siguiente:

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

Para los tipos java.time.LocalDate y java.time.Instant, será más sencillo ajustar el código que consume la fecha para que maneje el formato JSON-B/Yasson.

Para obtener más detalles sobre las diferencias de comportamiento entre Jackson y Yasson, consulte el artículo Is it time for a JSON binding standard? que compara el comportamiento de Jackson y JSON-B.