Singkat cerita, salah satu entitas saya memiliki GeometryCollection yang memberikan pengecualian saat Anda memanggil "getBoundary" (mengapa ini adalah buku lain, untuk sekarang katakanlah begini cara kerjanya).
Adakah cara agar saya bisa memberi tahu Jackson untuk tidak memasukkan pengambil yang spesifik itu? Saya tahu saya bisa menggunakan @JacksonIgnore ketika saya memiliki / mengontrol kode. Tapi ini tidak terjadi, jackson akhirnya mencapai titik ini melalui serialisasi terus menerus dari objek induk. Saya melihat opsi pemfilteran dalam dokumentasi jackson. Apakah itu solusi yang masuk akal?
Terima kasih!
objectMapper.addMixInAnnotations(Class<?> target, Class<?> mixinSource);
Satu kemungkinan lainnya adalah, jika Anda ingin mengabaikan semua properti yang tidak diketahui, Anda dapat mengkonfigurasi mapper sebagai berikut:
sumber
mapper.configure(DeserializationFeature.failOnUnknownPropertiesExcep(new String[] {"myField"}));
without()
seperti pada:mapper.reader().without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
Menggunakan Kelas Java
Menggunakan Annotation
sumber
Pendekatan berbasis anotasi lebih baik. Tetapi terkadang operasi manual diperlukan. Untuk tujuan ini, Anda dapat menggunakan tanpa metode ObjectWriter .
sumber
Anotasi campuran bekerja dengan cukup baik di sini seperti yang telah disebutkan. Kemungkinan lain di luar per-properti @JsonIgnore adalah menggunakan @JsonIgnoreType jika Anda memiliki tipe yang tidak boleh disertakan (mis. Jika semua instance properti GeometryCollection harus diabaikan). Anda kemudian dapat menambahkannya secara langsung (jika Anda mengontrol jenisnya), atau menggunakan campuran, seperti:
Ini bisa lebih mudah jika Anda memiliki banyak kelas yang semuanya memiliki satu atau lebih aksesor 'IgnoredType getContext ()' (yang merupakan kasus untuk banyak kerangka kerja)
sumber
Saya memiliki masalah serupa, tetapi itu terkait dengan hubungan dua arah Hibernate. Saya ingin menunjukkan satu sisi hubungan dan secara terprogram mengabaikan yang lain, tergantung pada pandangan apa yang saya hadapi. Jika Anda tidak bisa melakukan itu, Anda akan berakhir dengan nasty
StackOverflowException
s. Misalnya, jika saya memiliki benda-benda iniSaya ingin mengabaikan secara terprogram
parent
bidang di B jika saya melihat A, dan mengabaikanchildren
bidang di A jika saya melihat B.Saya mulai menggunakan mixin untuk melakukan ini, tapi itu dengan sangat cepat menjadi mengerikan; Anda memiliki begitu banyak kelas tidak berguna yang hanya ada untuk memformat data. Saya akhirnya menulis serializer saya sendiri untuk menangani ini dengan cara yang lebih bersih: https://github.com/monitorjbl/json-view .
Ini memungkinkan Anda menentukan secara terprogram kolom apa yang akan diabaikan:
Ini juga memungkinkan Anda dengan mudah menentukan tampilan yang sangat disederhanakan melalui pencocokan karakter pengganti:
Dalam kasus awal saya, kebutuhan akan tampilan sederhana seperti ini adalah untuk menunjukkan minimal tentang orang tua / anak, tetapi juga menjadi berguna untuk keamanan berbasis peran kita. Tampilan objek yang kurang memiliki hak istimewa diperlukan untuk mengembalikan lebih sedikit informasi tentang objek.
Semua ini berasal dari serializer, tetapi saya menggunakan Spring MVC di aplikasi saya. Agar dapat menangani kasus ini dengan benar, saya menulis integrasi yang dapat Anda masukkan ke kelas pengontrol Spring yang ada:
Keduanya tersedia di Maven Central. Saya harap ini membantu orang lain di luar sana, ini adalah masalah yang sangat buruk dengan Jackson yang tidak memiliki solusi yang baik untuk kasus saya.
sumber
Match.match()
?Jika Anda ingin SELALU mengecualikan properti tertentu untuk kelas apa pun, Anda dapat menggunakan
setMixInResolver
metode:sumber
Satu hal lagi yang bagus di sini adalah menggunakan
@JsonFilter
. Beberapa detailnya ada di sini http://wiki.fasterxml.com/JacksonFeatureJsonFiltersumber