Abaikan Null Fields dengan Jackson di Java dan Spring Boot

Nilai nol banyak muncul dalam pengembangan perangkat lunak, dan penanganan yang tepat dari null nilai-nilai dapat diubah menjadi ilmu itu sendiri. Jackson adalah perpustakaan de-facto untuk serialisasi dan deserialisasi objek Java - dan skenario umum berkaitan dengan serialisasi objek yang memiliki null bidang.

Dalam tutorial singkat ini, kita akan melihat bagaimana Anda dapat mengabaikan bidang nol saat membuat serial POJO dengan Jackson.

Mengubah Pengaturan ObjectMapper

ObjectMapper Jackson adalah API pusat yang memetakan objek ke nilai berseri. Secara alami, Anda dapat menyesuaikan dan menyesuaikan cara kerjanya melalui berbagai flag, salah satunya adalah:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Saat membuat serial dengan mapper ini, properti hanya akan disertakan jika bukan nol.

Ini menetapkan bendera global untuk objek apa pun yang diserialkan dengan objectMapper contoh. Jika Anda bekerja dengan Spring Boot, dan ObjectMapper yang diandalkannya tidak terbuka, Anda dapat mengubah bendera di application.properties File:

spring.jackson.default-property-inclusion = non_null

Atau, jika Anda menggunakan application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Catatan: Versi Spring yang lebih lama digunakan spring.jackson.serialization-inclusion=non_null alih-alih spring.jackson.default-property-inclusion=non_null.

Atau, Anda dapat mengupas kembali mengganti default ObjectMapper contoh dengan mendaftarkan yang baru @Primary @Bean, bernama objectMapper(), yang menggantikan implementasi default dan memungkinkan penyesuaian penuh atas instance yang akan digunakan secara default saat membuat serial dan deserializing:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return new ObjectMapper()
      .setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

Kredensial mikro @Bean harus masuk ke file apa saja itu dijelaskan dengan @Configuration anotasi, dan seringkali terletak di kelas konfigurasi khusus atau kelas utama aplikasi Boot Musim Semi.

Mengubah Instance Jackson2ObjectMapperBuilder

Musim semi menggunakan HttpMessageConverters untuk mengkonversi antara pesan HTTP dan objek. Konverter default adalah ObjectMapper dan XmlMapper contoh yang dipakai melalui Jackson2ObjectMapperBuilder.

Alih-alih menyediakan yang utama secara manual ObjectMapper (mengganti yang disediakan oleh pembuat), Anda dapat menginstruksikan Spring on cara membangun objek mapper sebagai gantinya. Ini memungkinkan Spring untuk melakukan konfigurasi tingkat tinggi tanpa Anda merusak objek tingkat rendah, sambil tetap menyesuaikan cara kerjanya. Selain itu, Anda juga dapat menyesuaikan XmlMapper cara ini dalam sekali jalan.

Untuk menyesuaikan pembangun, Anda mendaftarkan yang baru @Bean of Jackson2ObjectMapperBuilderCustomizer type, yang mengkustomisasi dan mengembalikan builder:

@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
    return builder -> {
      builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

@JsonSertakan Anotasi

Di ujung lain spektrum, kita dapat menggunakan anotasi, sebagai alternatif kode rendah! Anotasi dapat diterapkan di tingkat kelas atau tingkat metode:

@JsonInclude(JsonInclude.Include.NON_NULL)

Hal ini memungkinkan Anda untuk menyesuaikan hanya kelas tertentu, bukan perilaku global pemetaan objek.

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Catatan: Pada Jackson 2.0, nilai anotasinya adalah JsonInclude.Include.NON_NULL. Untuk versi sebelumnya, gunakan include=JsonSerialize.Inclusion.NON_NULL.

@JsonSertakan di Tingkat Kelas

Saat Anda melamar @JsonInclude di tingkat kelas, anotasi meluas ke semua pengambil dan penyetel:

@Entity(name="property")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

Setiap bidang tertentu yang memiliki null nilai tidak akan diserialkan.

@JsonInclude pada Metode-Level

Atau, Anda dapat menerapkan anotasi pada tingkat metode sebagai opsi paling terperinci:

@Entity(name="property")
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

Dalam cuplikan ini โ€“ anotasi hanya diterapkan pada TransactionType lapangan.

Kesimpulan

Dalam panduan ini, Anda telah mempelajari cara mengabaikan bidang nol di Jackson, dengan Java dan Spring Boot. Ini dapat dicapai secara global dengan menggantikan implisit yang mendasarinya ObjectMapper contoh dan menyesuaikan perilaku kacang utama baru yang Anda daftarkan.

Atau, Anda dapat menyesuaikan Jackson2ObjectMapperBuilder yang membangun ObjectMapper untuk aplikasi Anda alih-alih mengganti yang sudah dibuat. Untuk solusi kode rendah โ€“ Anda dapat mengubah spring.jackson.default-property-inclusion properti di file properti Anda.

Akhirnya โ€“ Anda dapat menggunakan @JsonInclude anotasi pada tingkat kelas atau tingkat metode.

Stempel Waktu:

Lebih dari penyalahgunaan