J'ai un problème avec mon deserializer personnalisé dans Jackson. Je veux accéder au sérialiseur par défaut pour peupler l'objet que je désérialise. Après le peuplement, je ferai des choses personnalisées, mais je veux d'abord désérialiser l'objet avec le comportement par défaut de Jackson.
Voici le code que j'ai pour l'instant.
public class UserEventDeserializer extends StdDeserializer<User> {
private static final long serialVersionUID = 7923585097068641765L;
public UserEventDeserializer() {
super(User.class);
}
@Override
@Transactional
public User deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
User deserializedUser = null;
deserializedUser = super.deserialize(jp, ctxt, new User());
// The previous line generates an exception java.lang.UnsupportedOperationException
// Because there is no implementation of the deserializer.
// I want a way to access the default spring deserializer for my User class.
// How can I do that?
//Special logic
return deserializedUser;
}
}
Ce dont j'ai besoin, c'est d'un moyen d'initialiser le désérialiseur par défaut afin de pouvoir pré-remplir mon POJO avant de lancer ma logique spéciale.
Lorsque l'on appelle deserialize à partir du deserializer personnalisé, il semble que la méthode soit appelée à partir du contexte actuel, quelle que soit la façon dont je construis la classe du serializer. À cause de l'annotation dans mon POJO. Cela provoque une exception Stack Overflow pour des raisons évidentes.
J'ai essayé d'initialiser un BeanDeserializer
mais le processus est extrêmement complexe et je n'ai pas réussi à trouver la bonne façon de le faire. J'ai également essayé de surcharger la fonction AnnotationIntrospector
en vain, en pensant que cela pourrait m'aider à ignorer l'annotation dans le fichier DeserializerContext
. Finalement, il semble que j'ai pu avoir un peu de succès en utilisant JsonDeserializerBuilders
bien que cela m'ait obligé à faire un peu de magie pour obtenir le contexte d'application de Spring. J'apprécierais toute chose qui pourrait me mener à une solution plus propre ; par exemple, comment puis-je construire un contexte de désérialisation sans lire le fichier JsonDeserializer
annotation.