ละเว้น Null Fields กับ Jackson ใน Java และ Spring Boot

ค่า Null เกิดขึ้นมากมายในการพัฒนาซอฟต์แวร์และการจัดการ .อย่างเหมาะสม null คุณค่าสามารถเปลี่ยนเป็นวิทยาศาสตร์ในตัวของมันเอง Jackson เป็นไลบรารี de-Facto สำหรับการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์เซชันของอ็อบเจ็กต์ Java – และสถานการณ์สมมติทั่วไปเกี่ยวข้องกับการทำให้เป็นอนุกรมอ็อบเจ็กต์ที่มี null ทุ่ง.

ในบทช่วยสอนสั้นๆ นี้ เราจะมาดูวิธีที่คุณสามารถละเว้นฟิลด์ null เมื่อทำการซีเรียล POJO กับ Jackson

การเปลี่ยนการตั้งค่า ObjectMapper

ObjectMapper ของ Jackson เป็น API กลางที่แมปวัตถุกับค่าที่เป็นอนุกรม โดยปกติ คุณสามารถปรับและปรับแต่งวิธีการทำงานผ่านแฟล็กต่างๆ ได้ ซึ่งหนึ่งในนั้นคือ:

objectMapper.setSerializationInclusion(Include.NON_NULL);

เมื่อจัดลำดับด้วย mapper นี้ คุณสมบัติจะถูกรวมไว้ก็ต่อเมื่อคุณสมบัติเหล่านั้นไม่เป็นค่าว่าง

สิ่งนี้กำหนดธง ทั่วโลก สำหรับวัตถุใด ๆ ที่ต่อเนื่องกับ objectMapper ตัวอย่าง. หากคุณกำลังทำงานกับ Spring Boot และ ObjectMapper ที่ใช้อยู่ไม่เปิดเผย คุณสามารถเปลี่ยนแฟล็กใน application.properties ไฟล์:

spring.jackson.default-property-inclusion = non_null

หรือถ้าคุณใช้ application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

หมายเหตุ ใช้ Spring เวอร์ชันเก่า spring.jackson.serialization-inclusion=non_null แทน spring.jackson.default-property-inclusion=non_null.

หรือคุณสามารถลอกกลับแทนที่ค่าเริ่มต้น ObjectMapper โดยการลงทะเบียนใหม่ @Primary @Beanชื่อ objectMapper()ซึ่งแทนที่การใช้งานเริ่มต้นและอนุญาตให้มีการปรับแต่งแบบเต็มบนอินสแตนซ์ที่จะใช้โดยค่าเริ่มต้นเมื่อทำให้เป็นอนุกรมและดีซีเรียลไลซ์:

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

@Bean ควรเข้าไป ไฟล์ใดก็ได้ ที่มีคำอธิบายประกอบกับ @Configuration คำอธิบายประกอบและมักจะอยู่ในคลาสการกำหนดค่าเฉพาะหรือคลาสหลักของแอปพลิเคชัน Spring Boot

การเปลี่ยนอินสแตนซ์ Jackson2ObjectMapperBuilder

ฤดูใบไม้ผลิใช้ HttpMessageConverters เพื่อแปลงระหว่างข้อความ HTTP และวัตถุ ตัวแปลงเริ่มต้นคือ ObjectMapper และ XmlMapper อินสแตนซ์ที่สร้างอินสแตนซ์ผ่าน Jackson2ObjectMapperBuilder.

แทนที่จะจัดหาหลักด้วยตนเอง ObjectMapper (แทนที่อันที่ผู้สร้างให้มา) คุณสามารถสั่ง Spring on วิธีการสร้าง ตัวแมปวัตถุแทน สิ่งนี้ทำให้ Spring ทำการกำหนดค่าระดับสูงโดยที่คุณไม่ต้องยุ่งเกี่ยวกับวัตถุระดับล่าง ในขณะที่ยังคงปรับแต่งวิธีการทำงาน นอกจากนี้ คุณยังสามารถปรับแต่ง XmlMapper ด้วยวิธีนี้ในครั้งเดียว

ในการปรับแต่งตัวสร้าง คุณต้องลงทะเบียนใหม่ @Bean of Jackson2ObjectMapperBuilderCustomizer ประเภทซึ่งปรับแต่งและส่งคืนตัวสร้าง:

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

@Jsonรวมคำอธิบายประกอบ

ในอีกด้านของสเปกตรัม เราสามารถใช้คำอธิบายประกอบเป็นทางเลือกที่มีโค้ดน้อย! สามารถใช้คำอธิบายประกอบที่ระดับคลาสหรือระดับเมธอด:

@JsonInclude(JsonInclude.Include.NON_NULL)

สิ่งนี้ช่วยให้คุณปรับแต่งเฉพาะคลาสบางคลาส แทนที่จะเป็นลักษณะการทำงานส่วนกลางของอ็อบเจ็กต์ mapper

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

หมายเหตุ สำหรับ Jackson 2.0 ค่าของคำอธิบายประกอบคือ JsonInclude.Include.NON_NULL. สำหรับเวอร์ชันก่อนหน้า ให้ใช้ include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude ในระดับคลาส

เมื่อคุณสมัคร @JsonInclude ที่ระดับคลาส คำอธิบายประกอบจะขยายไปถึงตัวรับและตัวตั้งค่าทั้งหมด:

@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;
    
    
}

ฟิลด์ใดก็ตามที่มี a null ค่าจะไม่ถูกจัดลำดับ

@JsonIncluded ในระดับวิธีการ

อีกวิธีหนึ่ง คุณสามารถใช้คำอธิบายประกอบที่ระดับวิธีการเป็นตัวเลือกที่ละเอียดที่สุด:

@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;
    
    
}

ในตัวอย่างนี้ – คำอธิบายประกอบใช้กับ the . เท่านั้น TransactionType สนาม

สรุป

ในคู่มือนี้ คุณได้เรียนรู้วิธีละเว้นฟิลด์ว่างใน Jackson ด้วย Java และ Spring Boot สิ่งนี้สามารถทำได้ทั่วโลกโดยแทนที่นัยสำคัญ ObjectMapper อินสแตนซ์และปรับแต่งพฤติกรรมของ primary bean ใหม่ที่คุณลงทะเบียน

หรือคุณสามารถปรับแต่ง Jackson2ObjectMapperBuilder ที่สร้าง ObjectMapper สำหรับแอปพลิเคชันของคุณแทนที่จะแทนที่แอปพลิเคชันที่สร้างไว้แล้ว สำหรับโซลูชันแบบ low-code – คุณสามารถเปลี่ยน spring.jackson.default-property-inclusion คุณสมบัติในไฟล์คุณสมบัติของคุณ

สุดท้าย – คุณสามารถใช้ the @JsonInclude คำอธิบายประกอบในระดับคลาสหรือระดับเมธอด

ประทับเวลา:

เพิ่มเติมจาก สแต็ค