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.