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.