Mam problem z moim niestandardowym deserializatorem w Jackson. Chcę uzyskać dostęp do domyślnego serializatora, aby wypełnić obiekt, do którego deserializuję. Po populacji zrobię kilka niestandardowych rzeczy, ale najpierw chcę deserializować obiekt z domyślnym zachowaniem Jacksona.
To jest kod, który mam w tej chwili.
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;
}
}
To, czego potrzebuję, to sposób na zainicjowanie domyślnego deserializatora, aby móc wstępnie wypełnić moje POJO przed rozpoczęciem mojej specjalnej logiki.
Podczas wywoływania deserializacji z poziomu niestandardowego deserializatora Wygląda na to, że metoda jest wywoływana z bieżącego kontekstu, niezależnie od tego, jak skonstruuję klasę serializatora. Z powodu adnotacji w moim POJO. Powoduje to wyjątek przepełnienia stosu z oczywistych powodów.
Próbowałem zainicjować plik, BeanDeserializer
ale proces jest niezwykle złożony i nie udało mi się znaleźć właściwego sposobu, aby to zrobić. Próbowałem również przeciążać AnnotationIntrospector
plik bez skutku, myśląc, że może mi to pomóc zignorować adnotację w DeserializerContext
. W końcu wydaje się, że mogłem odnieść sukces, JsonDeserializerBuilders
chociaż wymagało to ode mnie magicznych rzeczy, aby poznać kontekst aplikacji ze Springa. Byłbym wdzięczny za każdą rzecz, która mogłaby doprowadzić mnie do bardziej przejrzystego rozwiązania, na przykład jak mogę skonstruować kontekst deserializacji bez czytania JsonDeserializer
adnotacji.
DeserializationContext
nie jest czymś, co powinieneś stworzyć lub zmienić; będzie dostarczony przezObjectMapper
.AnnotationIntrospector
podobnie nie pomoże w uzyskaniu dostępu.