2 votes

Désérialisation du temps java8 dans Websphere Liberty

J'ai des problèmes avec mon installation Websphere Liberty/Instance IBM Bluemix. J'utilise les nouvelles classes java.time (par exemple LocalDateTime), mais la version désérialisée à l'aide du mappeur Jackson 2.8 donne des résultats peu maniables (désérialisation complète de l'objet au lieu des horodatages). https://geowarin.github.io/jsr310-dates-with-jackson.html Mais comment puis-je faire de même avec Liberty ? Par exemple : recevoir 2016-02-02T23:24:08.255+01:00 comme résultat dans une réponse JSON désérialisée.

Merci

3voto

Azquelt Points 106

La fonctionnalité Liberty JAX-RS 2.0 inclut Jackson pour effectuer une sérialisation de base des classes Java en JSON, mais elle n'expose aucune des API Jackson.

Si vous souhaitez modifier le comportement de Jackson, vous devez regrouper ces bibliothèques dans votre application afin que Liberty utilise le Jackson que vous avez fourni, plutôt que celui qu'il possède en interne :

Ensuite, vous pouvez également inclure le Module Jackson JSR310 pour obtenir vos temps Java 8 sérialisés comme vous le souhaitez.

Cependant, selon la documentation de cette page, vous devez enregistrer le module avec votre mappeur d'objets.

Vous voulez appeler JacksonJsonProvider.setMapper() mais ce n'est pas simple, car cet objet est généralement instancié automatiquement par Liberty et vous ne le voyez jamais.

En revanche, vous pouvez créer un ContextProvider pour indiquer au fournisseur JAX-RS de Jackson quel ObjectMapper utiliser lorsqu'il est instancié par Liberty.

En adaptant l'exemple de votre lien, vous pourriez écrire quelque chose comme ceci :

@Provider
public class JSR310MapperProvider implements ContextResolver<ObjectMapper> {

    @Override
    public ObjectMapper getContext(Class<?> type) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return mapper;
    }
}

Cela devrait créer un mappeur configuré qui devrait ensuite être utilisé par Jackson pour sérialiser vos objets temporels Java 8.


Mise à jour : Si vous remplacez getClasses() dans votre Application la classe JacksonJsonProvider et votre JSR310MapperProvider ne sera pas automatiquement découvert. Vous devrez inclure ces deux classes dans l'ensemble que vous retournez à partir de getClasses()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X