Ho un problema con il mio deserializzatore personalizzato a Jackson. Voglio accedere al serializzatore predefinito per popolare l'oggetto in cui deserializzo. Dopo il popolamento, farò alcune cose personalizzate, ma prima deserializzare l'oggetto con il comportamento Jackson predefinito.
Questo è il codice che ho al momento.
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;
}
}
Ciò di cui ho bisogno è un modo per inizializzare il deserializzatore predefinito in modo da poter precompilare il mio POJO prima di avviare la mia logica speciale.
Quando si chiama deserialize dall'interno del deserializzatore personalizzato Sembra che il metodo venga chiamato dal contesto corrente indipendentemente da come costruisco la classe serializer. A causa dell'annotazione nel mio POJO. Ciò causa un'eccezione di overflow dello stack per ovvi motivi.
Ho provato a inizializzare a BeanDeserializer
ma il processo è estremamente complesso e non sono riuscito a trovare il modo giusto per farlo. Ho anche provato a sovraccaricare AnnotationIntrospector
inutilmente il file, pensando che potrebbe aiutarmi a ignorare l'annotazione nel file DeserializerContext
. Alla fine sembra che avrei potuto avere un certo successo usando JsonDeserializerBuilders
anche se questo mi ha richiesto di fare alcune cose magiche per ottenere il contesto dell'applicazione da Spring. Apprezzerei qualsiasi cosa che possa portarmi a una soluzione più pulita, ad esempio come posso costruire un contesto di deserializzazione senza leggere l' JsonDeserializer
annotazione.
DeserializationContext
non è qualcosa che dovresti creare o modificare; sarà fornito daObjectMapper
.AnnotationIntrospector
, allo stesso modo, non sarà di aiuto per ottenere l'accesso.