Saya mendapatkan pengecualian ketika mencoba membuat serial objek yang sangat sederhana menggunakan Jackson. Kesalahan:
org.codehaus.jackson.map.JsonMappingException: Tidak ada serializer yang ditemukan untuk kelas MyPackage.TestA dan tidak ada properti yang ditemukan untuk membuat BeanSerializer (untuk menghindari pengecualian, nonaktifkan SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Di bawah ini adalah kelas dan kode sederhana untuk diserialisasi.
Adakah yang bisa memberitahu saya mengapa saya mendapatkan kesalahan ini?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Jawaban:
Seperti yang sudah dijelaskan, konfigurasi default sebuah
ObjectMapper
instance adalah hanya mengakses properti yang merupakan bidang publik atau memiliki getter / setter publik. Alternatif untuk mengubah definisi kelas untuk membuat bidang menjadi publik atau untuk menyediakan pengambil / penyetel publik adalah dengan menetapkan (ke dasarVisibilityChecker
) aturan visibilitas properti yang berbeda. Jackson 1.9 menyediakanObjectMapper.setVisibility()
metode kenyamanan untuk melakukannya. Sebagai contoh dalam pertanyaan awal, saya kemungkinan akan mengkonfigurasi ini sebagaiUntuk Jackson> 2.0:
Untuk informasi lebih lanjut dan detail tentang opsi konfigurasi terkait, saya sarankan meninjau JavaDocs aktif
ObjectMapper.setVisibility()
.sumber
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
{"term":{"call_failed":"true"}}
itu menghasilkan struktur yaml sebagai:filter: map: term: map: call_failed: "true"
Mengapa menghasilkanmap
kata kunci? Bagaimana saya bisa menghapusnya?@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
atas kelas AndaAgar Jackson membuat cerita bersambung dari kelas itu,
SomeString
field harus berupapublic
(sekarang isolasi tingkat paket) atau Anda perlu mendefinisikan metode pengambil dan penyetel untuknya.sumber
Saya memiliki masalah yang sama dalam kode sumber saya. Saya baru saja menambahkan
dan
masalah terpecahkan.
sumber
Masalah dalam kasus saya adalah Jackson mencoba membuat serial objek kosong tanpa atribut atau metode.
Seperti yang disarankan dalam pengecualian saya menambahkan baris berikut untuk menghindari kegagalan pada kacang kosong:
Untuk Jackson 1.9
Untuk Jackson 2.X
Anda dapat menemukan contoh sederhana tentang jackson menonaktifkan fail_on_empty_beans
sumber
Saya memiliki masalah yang sama untuk kelas anak di mana saya memiliki kontrol, objek mapper berada di modul umum dan tidak dapat diakses. Saya memecahkannya dengan menambahkan anotasi ini untuk kelas anak saya yang objeknya akan serial.
sumber
Jika Anda dapat mengedit kelas yang berisi objek itu, saya biasanya hanya menambahkan anotasi
sumber
org.codehaus.jackson.annotate.JsonIgnore
Kesalahan ini juga terjadi jika Anda lupa menambahkan metode .build () ke status pengembalian Anda.
Saya mendapatkan kesalahan berikut tanpa metode build ():
sumber
SpringBoot2.0 , Saya mengatasinya dengan mengikuti kode:
sumber
Untuk aplikasi Oracle Java, tambahkan ini setelah
ObjectMapper
instantiation:sumber
Saya punya masalah yang sama dengan pemuatan malas melalui objek proxy hibernate. Mengatasinya dengan memberi anotasi pada kelas yang memiliki properti pribadi malas dengan:
sumber
Masalahnya mungkin karena Anda telah mendeklarasikan variabel sebagai
private
. Jika Anda mengubahnya kepublic
, itu berfungsi.Pilihan yang lebih baik adalah menggunakan metode pengambil dan penyetel untuk itu.
Ini akan menyelesaikan masalah!
sumber
Saya menemukan setidaknya tiga cara untuk melakukan ini:
public getters
entitas Anda yang ingin Anda buat bersambung;public getters
. Ini akan mengubah default untuk Jackson dariVisbility=DEFAULT
menjadi@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
mana setiap pengubah akses diterima;ObjectMapper
global Anda dengan pengaturanobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Ini harus dihindari jika Anda tidak membutuhkan fungsi ini secara global.Pilih berdasarkan kebutuhan Anda.
sumber
Berikut adalah tiga opsi:
public
public
, tambahkan getter & setter@JsonIgnore("context")
sumber
Silakan gunakan ini di tingkat kelas untuk kacang:
sumber
menambahkan setter dan pengambil juga akan menyelesaikan masalah karena sudah diperbaiki untuk saya. Untuk Ex:
sumber
Saya hanya mendapatkan getter, setelah menambahkan setter juga, masalah teratasi.
sumber
Meskipun saya menambahkan getter dan setter saya mendapatkan kesalahan yang sama. Kemudian saya menemukan bug, yaitu atas saran Sonar saya menyerahkan getter dan setter sebagai dilindungi yang menyebabkan masalah. Setelah saya perbaiki itu berfungsi seperti yang diharapkan.
sumber
di boot musim semi 2.2.5
setelah menambahkan pengambil dan penyetel
saya menambahkan @JsonIgnore di atas bidang.
sumber