Bagaimana cara menonaktifkan fail_on_empty_beans di Jackson?

100

Menggunakan jackson 2.1, bagaimana cara menonaktifkan fail_on_empty beanspesan kesalahan yang sepertinya ingin saya nonaktifkan?

Saya berasumsi bahwa ini hanyalah hal yang paling sederhana di dunia, tetapi sebenarnya sudah terlambat dan saya belum dapat menemukan tutorial sederhana atau sesuatu yang sangat jelas dari api. SerializationFactory? Mengapa mereka membuatnya begitu tidak intuitif dan kemudian membuat pesan kesalahan tampak begitu jelas?

Meskipun saya lakukan seperti pesan kesalahan, maksud saya, lebih baik daripada NPE.

Saya berasumsi ada cara untuk melakukan ini menggunakan anotasi - tetapi saya tidak tertarik menggunakannya sama sekali untuk pekerjaan sederhana yang saya lakukan!

bharal
sumber

Jawaban:

125

Anda dapat melakukan ini per kelas atau secara global, saya yakin.

Untuk per kelas, coba @JsonSerialize di atas deklarasi kelas.

Untuk seorang pembuat peta, berikut salah satu contohnya:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// do various things, perhaps:
String someJsonString = mapper.writeValueAsString(someClassInstance);
SomeClass someClassInstance = mapper.readValue(someJsonString, SomeClass.class)

Tautan StackOverflow di bawah ini juga memiliki contoh untuk proyek Spring.

Untuk REST dengan Jersey, saya tidak ingat di luar kepala saya, tapi saya percaya itu serupa.


Beberapa tautan yang saya gali: (tautan pertama diedit karena Codehaus ditutup).

Pancakeo
sumber
Saya menggunakan yang ini sebelumnya hari ini, memiliki beberapa info lagi, misalnya penemuan otomatis. stackoverflow.com/questions/4362104/…
Pancakeo
1
Bisakah Anda memberi contoh tentang cara menggunakan @JsonSerializeuntuk menonaktifkan FAIL_ON_EMPTY_BEANSpada deklarasi kelas?
tuk
2
Sudah beberapa tahun :). Ini mungkin bisa membantu: stackoverflow.com/questions/12162413/…
Pancakeo
Atau Anda dapat menggunakan metode menonaktifkan kelas ObjectMapper seperti "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu
43

Jika Anda menggunakan Spring Boot, Anda dapat menyetel properti berikut di file application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

abhishek jain
sumber
22

Anda juga bisa mendapatkan masalah yang sama jika kelas Anda tidak berisi metode / properti publik. Saya biasanya telah mendedikasikan DTO untuk permintaan dan tanggapan API, menyatakan publik, tetapi lupa dalam satu kasus untuk membuat metode publik juga - yang menyebabkan kacang "kosong" di tempat pertama.

RJStanford
sumber
13

Anda juga mungkin dapat membuat anotasi kelas dengan @JsonIgnoreProperties(ignoreUnknown=true)untuk mengabaikan bidang yang tidak ditentukan di kelas

AllDayAmazing
sumber
1
Ini tidak akan bekerja jika seluruh biji benar-benar null
maryoush
12

Jika Anda ingin mendapatkan objek JSON tanpa bidang tambahan - tambahkan anotasi ini ke kelas Anda, ini bekerja sempurna untuk saya.

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Anda juga dapat menambahkan file application.properties di baris ini, tetapi ini akan menambahkan kolom tambahan ke JSON Anda.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
pengguna1913615
sumber
Saya mencoba mengembalikan JSON dari dalam salah satu pengontrol saya di aplikasi REST boot musim semi dan ini memperbaikinya untuk saya.
ninjasense
Cara yang sempurna jika Anda memiliki benda kosong!
Georgi Peev
3

Jika Anda menggunakan org.codehaus.jackson.map.ObjectMapper, silakan. gunakan baris berikut

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
thangamanikasi
sumber
3

Di Jersey Rest Services cukup gunakan anotasi JacksonFeatures ...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}
mephistopheles78
sumber
1

Dalam kasus saya, saya melewatkan untuk menulis anotasi @JsonProperty di salah satu bidang yang menyebabkan kesalahan ini.

Wahib Ul Haq
sumber
1

Menambahkan solusi di sini untuk masalah yang berbeda, tetapi solusi yang memanifestasikan kesalahan yang sama ... Berhati-hatilah saat membuat json dengan cepat (sebagai respons api atau apa pun) untuk menghindari tanda kutip ganda literal di anggota string Anda. Anda mungkin menggunakan json rusak Anda sendiri.

Kirk B.
sumber
1

Untuk memperbaiki masalah ini, konfigurasikan kelas JsonDataFormat Anda seperti di bawah ini

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

yang hampir setara dengan,

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Reddeiah Pidugu
sumber
0
ObjectMapper mapper = new ObjectMapper();

Hai,

Saat saya menggunakan mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Nilai objek json saya menjadi '' kosong dalam maksud halaman sudut sebagai tanggapan

Diselesaikan dengan bantuan hanya di bawah pengaturan

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
Shahid Hussain Abbasi
sumber
0

Dalam kasus saya, saya tidak perlu menonaktifkannya, melainkan saya harus meletakkan kode ini di atas kelas saya: (dan ini menyelesaikan masalah saya)

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)//this is what was added
    @Value //this was there already
    @Builder//this was there already

public class NameOfClass {
     //some code in here.
}
AppEmmanuel
sumber