Tengo un problema en mi deserializador personalizado en Jackson. Quiero acceder al serializador predeterminado para completar el objeto en el que estoy deserializando. Después de la población, haré algunas cosas personalizadas, pero primero quiero deserializar el objeto con el comportamiento predeterminado de Jackson.
Este es el código que tengo en este 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;
}
}
Lo que necesito es una forma de inicializar el deserializador predeterminado para poder rellenar previamente mi POJO antes de iniciar mi lógica especial.
Al llamar a deserializar desde dentro del deserializador personalizado, parece que el método se llama desde el contexto actual sin importar cómo construya la clase de serializador. Por la anotación en mi POJO. Esto provoca una excepción de desbordamiento de pila por razones obvias.
He intentado inicializar un, BeanDeserializer
pero el proceso es extremadamente complejo y no he logrado encontrar la manera correcta de hacerlo. También intenté sobrecargar AnnotationIntrospector
sin éxito, pensando que podría ayudarme a ignorar la anotación en DeserializerContext
. Finalmente, parece que podría haber tenido cierto éxito con el uso, JsonDeserializerBuilders
aunque esto me obligó a hacer algunas cosas mágicas para obtener el contexto de la aplicación de Spring. Agradecería cualquier cosa que pudiera llevarme a una solución más limpia, por ejemplo, ¿cómo puedo construir un contexto de deserialización sin leer la JsonDeserializer
anotación?
DeserializationContext
no es algo que debas crear o cambiar; será proporcionado porObjectMapper
.AnnotationIntrospector
, del mismo modo, no será de ayuda para obtener acceso.