Jackson deserialize ISO8601 fromatted date-heure dans Java8 Instant
J'essaie de désérialiser une date formatée ISO8601 en Java8 Instant en utilisant Jackson. J'ai enregistré JavaTimeModule avec ObjectMapper, désactivé WRITE_DATES_AS_TIMESTAMPS.
Cependant, si l'on essaie de désérialiser 2016-03-28T19:00:00.000+01:00 cela ne fonctionnera pas, car il semble que JavaTimeModule ne désérialise que les dates-heures formatées avec un décalage de fuseau horaire UTC (par exemple 2016-03-28T18:00:00.000 Z). J'ai ensuite essayé d'utiliser l'annotation @JsonFormat comme ceci:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "UTC")
Et comme ceci:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = JsonFormat.DEFAULT_TIMEZONE)
Cependant, aucun de ces travaux et je reçois une exception:
com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"])
Ce qui implique que le paramètre timezone est ignoré et que date time formatter ne sait pas comment formater un Instant sans fuseau horaire.
Existe-t-il un moyen de désérialiser une chaîne ISO8601 qui n'est pas dans le fuseau horaire UTC décalé vers Java 8 Instant en utilisant Jackson et JavaTimeModule sans écrire de désérialiseur personnalisé?
2 answers
Vous devez définir le fuseau horaire explicite via {[1] } dans votre classe modell:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
private Date date;
(voir: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)
Le format "Z" ne fonctionne pas avec "+01:00" car il s'agit d'un modèle différent. JsonFormat utilise des modèles SimpleDateFormat. "Z" dans majuscules ne représente que la stricte RFC 822. Vous devez utiliser une syntaxe comme: "+ 0100", sans deux-points.