A ligação do JSON para tipos de data, hora e calendário deve ser convertida

No JAX-RS 2.1, a biblioteca interna usada para serialização e desserialização entre objetos JSON e Java foi mudada de Jackson para Yasson. Yasson é a implementação de referência de JSON-B. O Jackson e o Yasson serializarão objetos relacionados ao tempo de diferentes maneiras, por exemplo:

Jackson Yasson
java.util.Date 726213720000 1993-02-05T06:02:00Z [ UTC ]
java.util.Calendar 726213720000 1993-02-05T00:00:00-06:00 [ América/Chicago ]
java.time.Instant {7}{2}{6}{2}{1}{3}{7}{2}{0}, "nano": 0 } 1993-02-05T06:02:00Z
java.time.LocalDate LocalDate {1}{9}{9}{3}, "month": "FEBRUARY", "dayOfMonth": 5,... } 1993-02-05

Essa regra sinaliza métodos do recurso JAX-RS que produzem ou consomem dados do tipo JSON dos seguintes tipos:

Os métodos que produzem ou consomem qualquer um dos tipos listados anteriormente precisam ser convertidos. Observe que qualquer método que produza ou consuma um objeto que contenha qualquer um desses tipos também precisará ser abordado.

O scanner binário apenas detecta métodos que consomem ou produzem diretamente os tipos mencionados anteriormente. No entanto, se um método consome ou produz um objeto que contém esses tipos, o scanner binário não detectará o uso do tipo. Se estiver usando o scanner binário, revise todas as anotações @javax.ws.rs.Produces e @javax.ws.rs.Consumes que especificam JSON ou curinga e garantem que qualquer método que produza ou consuma objetos contendo qualquer um dos tipos aplicáveis ​​sejam convertidos.

A seguir está um exemplo de métodos de recurso JAX-RS que serão sinalizados por essa regra:

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

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

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

Para métodos de recurso JAX-RS que retornam diretamente java.util.Date ou java.util.Calendar, o tipo de retorno deve ser mudado para digitar long para manter a mesma saída que o Jackson. Por exemplo, se um método estiver retornando um objeto Date conforme visto aqui:

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

O método pode ser mudado para o seguinte:

    @GET
    @Path("/get")
    @Produces(MediaType..APPLICATION_JSON) público longo getDate() {
        return new Date(...).getTime();
    }

Para os tipos java.time.LocalDate e java.time.Instant, será mais simples ajustar o código que consome a data para que manipule o formato JSON-B/Yasson.

Para obter mais detalhes sobre as diferenças de comportamento entre o Jackson e o Yasson, consulte o artigo É o momento para um padrão de ligação JSON? comparando o comportamento do Jackson e do JSON-B.