Tenho um problema no meu desserializador personalizado em Jackson. Desejo acessar o serializador padrão para preencher o objeto para o qual estou desserializando. Depois da população, farei algumas coisas personalizadas, mas primeiro quero desserializar o objeto com o comportamento padrão de Jackson.
Este é o código que tenho no 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;
}
}
O que eu preciso é de uma maneira de inicializar o desserializador padrão para que eu possa pré-preencher meu POJO antes de iniciar minha lógica especial.
Ao chamar desserializar de dentro do desserializador personalizado Parece que o método é chamado a partir do contexto atual, não importa como eu construo a classe do serializador. Por causa da anotação no meu POJO. Isso causa uma exceção Stack Overflow por razões óbvias.
Tentei inicializar um, BeanDeserializer
mas o processo é extremamente complexo e não consegui encontrar a maneira certa de fazer isso. Também tentei sobrecarregar o AnnotationIntrospector
sem sucesso, pensando que isso poderia me ajudar a ignorar a anotação no DeserializerContext
. Por fim, parece que tive algum sucesso com o uso, JsonDeserializerBuilders
embora isso exigisse que eu fizesse algumas coisas mágicas para obter o contexto do aplicativo do Spring. Eu apreciaria qualquer coisa que pudesse me levar a uma solução mais limpa, por exemplo, como posso construir um contexto de desserialização sem ler a JsonDeserializer
anotação.
DeserializationContext
não é algo que você deve criar ou alterar; será fornecido porObjectMapper
.AnnotationIntrospector
, da mesma forma, não ajudará na obtenção de acesso.