Jackson'daki özel seri kaldırıcımda bir sorun var. Seri durumdan çıkardığım nesneyi doldurmak için varsayılan serileştiriciye erişmek istiyorum. Popülasyondan sonra bazı özel şeyler yapacağım ama önce nesneyi varsayılan Jackson davranışıyla seri durumdan çıkarmak istiyorum.
Şu anda sahip olduğum kod bu.
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;
}
}
İhtiyacım olan şey, özel mantığıma başlamadan önce POJO'mu önceden doldurabilmem için varsayılan seri kaldırıcıyı başlatmanın bir yoludur.
Özel serileştiricinin içinden seriyi kaldırmayı çağırırken Serileştirici sınıfını nasıl kurarsam yapayım, yöntem geçerli bağlamdan çağrılıyor gibi görünüyor. POJO'mdaki ek açıklama nedeniyle. Bu, bariz nedenlerle Yığın Taşması istisnasına neden olur.
A'yı başlatmayı denedim BeanDeserializer
ancak süreç son derece karmaşık ve bunu yapmanın doğru yolunu bulamadım. Ayrıca AnnotationIntrospector
, içindeki ek açıklamayı görmezden gelmeme yardımcı olabileceğini düşünerek boşuna aşırı yüklemeyi denedim DeserializerContext
. Sonunda JsonDeserializerBuilders
, Spring'in uygulama içeriğini elde etmek için bazı sihirli şeyler yapmamı gerektirmesine rağmen, kullanarak biraz başarılı olabileceğimi gösteriyor . Beni daha temiz bir çözüme götürebilecek her şeyi takdir ederim, örneğin JsonDeserializer
ek açıklamayı okumadan seri durumdan çıkarma bağlamını nasıl oluşturabilirim .
DeserializationContext
yaratmanız veya değiştirmeniz gereken bir şey değildir; tarafından sağlanacaktırObjectMapper
.AnnotationIntrospector
, aynı şekilde, erişim sağlamada yardımcı olmayacaktır.