Dans JAX-RS 2.1, la bibliothèque interne Jackson utilisée pour la sérialisation et la désérialisation entre les objets JSON et Java a été remplacée par Yasson. Yasson est l'implémentation de référence de JSON-B. Jackson et Yasson sérialisent différemment les objets liés au temps. Par exemple :
| 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 |
Cette règle marque les méthodes de ressource JAX-RS qui génèrent ou consomment des données de type JSON dont les types sont les suivants :
Les méthodes qui génèrent ou consomment un des types répertoriés précédemment doivent être converties. Il est également nécessaire de prendre en compte les méthodes qui génèrent ou consomment un objet contenant un de ces types.
Le scanner de binaires détecte uniquement les méthodes qui consomment ou génèrent
les types mentionnés précédemment. Toutefois, si une
méthode consomme ou génère un objet qui contient ces types, il ne détecte pas l'utilisation de type. Si vous utilisez
le scanner de binaires, consultez toutes les annotations @javax.ws.rs.Produces et @javax.ws.rs.Consumes
qui spécifient un élément JSON ou générique et assurez-vous que les méthodes qui génèrent ou consomment des objets incluant
un des types applicables sont convertis.
Voici un exemple de méthodes de ressource JAX-RS marquées par cette règle :
@Path("/")
@ApplicationScoped
classe publique MyService {
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON) public Date getDate() {
//...
}
@GET
@Path("/set")
@Consumes(MediaType.APPLICATION_JSON) public void setDate(Date date) {
//...
} }
Pour les méthodes de ressource JAX-RS qui renvoient directement java.util.Date ou java.util.Calendar, le type de retour doit être remplacé par le type long pour conserver la même sortie que Jackson. Par exemple, si une
méthode renvoie un objet Date comme illustré ici :
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON) public Date getDate() {
return new Date(...);
}
La méthode peut être remplacée par ce qui suit :
@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON) public long getDate() {
return new Date(...).getTime();
}
Pour les types java.time.LocalDate et java.time.Instant, il est plus simple d'ajuster le code qui consomme la date afin qu'il gère le format JSON-B/Yasson.
Pour plus d'informations sur les différences de comportement entre Jackson et Yasson, consultez l'article Is it time for a JSON binding standard? qui compare les comportements de Jackson et JSON-B.