J'ai un problème dans mon désérialiseur personnalisé à Jackson. Je souhaite accéder au sérialiseur par défaut pour remplir l'objet dans lequel je désérialise. Après la population, je vais faire des choses personnalisées mais je veux d'abord désérialiser l'objet avec le comportement par défaut de Jackson.
C'est le code que j'ai en ce moment.
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 que je puisse pré-remplir mon POJO avant de démarrer ma logique spéciale.
Lors de l'appel de désérialisation depuis le désérialiseur personnalisé Il semble que la méthode soit appelée à partir du contexte actuel, quelle que soit la manière dont je construis la classe de sérialiseur. À cause de l'annotation dans mon POJO. Cela provoque une exception de débordement de pile 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 le AnnotationIntrospector
en vain, pensant que cela pourrait m'aider à ignorer l'annotation dans le DeserializerContext
. Enfin, il semble que j'aie eu un certain succès en utilisant, JsonDeserializerBuilders
bien que cela m'oblige à faire des choses magiques pour obtenir le contexte de l'application de Spring. J'apprécierais toute chose qui pourrait me conduire à une solution plus propre, par exemple comment puis-je construire un contexte de désérialisation sans lire l' JsonDeserializer
annotation.
DeserializationContext
n'est pas quelque chose que vous devez créer ou modifier; il sera fourni parObjectMapper
.AnnotationIntrospector
, de même, ne sera d'aucune utilité pour y accéder.