Saya mengalami masalah dengan deserializer khusus saya di Jackson. Saya ingin mengakses serializer default untuk mengisi objek yang saya deserialisasi. Setelah populasi saya akan melakukan beberapa hal khusus tetapi pertama-tama saya ingin deserialize objek dengan perilaku Jackson default.
Ini adalah kode yang saya miliki saat ini.
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;
}
}
Yang saya perlukan adalah cara untuk menginisialisasi deserializer default sehingga saya dapat mengisi POJO saya terlebih dahulu sebelum memulai logika khusus.
Ketika memanggil deserialize dari dalam custom deserializer Tampaknya metode ini dipanggil dari konteks saat ini tidak peduli bagaimana saya membangun kelas serializer. Karena anotasi di POJO saya. Ini menyebabkan pengecualian Stack Overflow karena alasan yang jelas.
Saya telah mencoba menginisialisasi a BeanDeserializer
tetapi prosesnya sangat rumit dan saya belum berhasil menemukan cara yang tepat untuk melakukannya. Saya juga telah mencoba membebani secara berlebihan namun AnnotationIntrospector
tidak berhasil, karena berpikir bahwa hal itu dapat membantu saya mengabaikan anotasi di DeserializerContext
. Akhirnya, saya mungkin telah berhasil menggunakan JsonDeserializerBuilders
meskipun ini mengharuskan saya untuk melakukan beberapa hal ajaib untuk mendapatkan konteks aplikasi dari Spring. Saya akan menghargai hal apa pun yang dapat membawa saya ke solusi yang lebih bersih, misalnya bagaimana saya dapat membuat konteks deserialisasi tanpa membaca JsonDeserializer
anotasi.
DeserializationContext
bukanlah sesuatu yang harus Anda buat atau ubah; itu akan disediakan olehObjectMapper
.AnnotationIntrospector
, juga, tidak akan membantu mendapatkan akses.