Powiązanie JSON dla typów daty, godziny i kalendarza musi zostać przekształcone

W usługach JAX-RS 2.1 wewnętrzna biblioteka używana do przekształcania do i z postaci szeregowej między obiektami JSON i Java została zmieniona z Jackson na Yasson. Yasson jest implementacją odwołania JSON-B. Biblioteki Jackson i Yasson przekształcą obiekty związane z czasem na różne sposoby, na przykład:

Jackson Yasson
java.util.Date 726213720000 1993-02-05T06:02:00Z[UTC]
java.util.Calendar 726213720000 1993-02-05T00:00:00-06:00[Ameryka/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

Ta reguła powoduje oznaczenie metod zasobów JAX-RS, które generują lub konsumują dane typu JSON następujących typów:

Metody, które generują lub konsumują którekolwiek z wymienionych wcześniej typów, muszą zostać przekształcone. Należy zwrócić uwagę na to, że wszystkie metody, które generują lub konsumują obiekt zawierający dowolny z tych typów, również muszą być zmodyfikowane.

Skaner binarny wykrywa tylko metody, które konsumują lub generują wymienione wcześniej typy bezpośrednio. Jeśli jednak metoda konsumuje lub generuje obiekt zawierający te typy, skaner binarny nie wykryje użycia tego typu. Jeśli używany jest skaner binarny, przejrzyj wszystkie adnotacje @javax.ws.rs.Produces i @javax.ws.rs.Consumes, które określają kod JSON lub znak wieloznaczny, i upewnij się, że zostały przekształcone wszystkie metody, które generują lub konsumują obiekty zawierające dowolne z tych typów.

Poniżej znajduje się przykład metod zasobów JAX-RS, które zostaną oznaczone flagą przez tę regułę:

@Path("/")
@ApplicationScoped
public class MyService {

    @GET
    @Path("/get")
    @Produces(MediaType).APPLICATION_JSON) publiczna data getDate() {
        //...
    }

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

W przypadku metod zasobów JAX-RS, które zwracają bezpośrednio typ java.util.Date lub java.util.Calendar, typ zwracany należy zmienić na typ long, aby uzyskać takie same dane wyjściowe jak w przypadku biblioteki Jackson. Jeśli na przykład metoda zwraca obiekt Date, jak pokazano tutaj:

    @GET
    @Path("/get")
    @Produces(MediaType).APPLICATION_JSON) publiczna data getDate() {
        return new Date(...);
    }

Metoda ta może zostać zmieniona na następującą:

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

W przypadku typów java.time.LocalDate i java.time.Instant będzie prościej dostosować kod, który pobiera datę, tak aby obsługiwał format JSON-B/Yasson.

Aby uzyskać więcej szczegółów na temat różnic w zachowaniu między specyfikacjami Jackson a Yasson, należy zapoznać się z informacjami na stronie Czy już czas na standard powiązań JSON? Artykuł porównujący zachowanie Jackson i JSON-B.