Bỏ qua Null Fields với Jackson trong Java và Spring Boot

Giá trị rỗng phát sinh rất nhiều trong quá trình phát triển phần mềm và xử lý thích hợp null các giá trị có thể tự nó trở thành một khoa học. Jackson là thư viện thực tế để tuần tự hóa và giải tuần tự hóa các đối tượng Java - và một kịch bản phổ biến liên quan đến việc tuần tự hóa các đối tượng có null các lĩnh vực.

Trong hướng dẫn ngắn này, chúng ta sẽ xem xét cách bạn có thể bỏ qua các trường rỗng khi tuần tự hóa POJO với Jackson.

Thay đổi cài đặt ObjectMapper

ObjectMapper của Jackson là API trung tâm ánh xạ các đối tượng tới các giá trị được tuần tự hóa. Đương nhiên, bạn có thể điều chỉnh và tùy chỉnh cách hoạt động của nó thông qua nhiều cờ khác nhau, một trong số đó là:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Khi tuần tự hóa bằng trình ánh xạ này, các thuộc tính sẽ chỉ được đưa vào nếu chúng không có giá trị rỗng.

Điều này đặt cờ trên toàn cầu cho bất kỳ đối tượng nào đang được tuần tự hóa với objectMapper ví dụ. Nếu bạn đang làm việc với Spring Boot và ObjectMapper mà nó dựa vào không bị lộ, bạn có thể thay đổi cờ trong application.properties tập tin:

spring.jackson.default-property-inclusion = non_null

Hoặc, nếu bạn đang sử dụng application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Lưu ý: Đã sử dụng các phiên bản cũ hơn của Spring spring.jackson.serialization-inclusion=non_null thay vì spring.jackson.default-property-inclusion=non_null.

Ngoài ra, bạn có thể bóc lại thay thế mặc định ObjectMapper ví dụ bằng cách đăng ký một @Primary @Bean, đặt tên objectMapper(), ghi đè cài đặt mặc định và cho phép tùy chỉnh hoàn toàn đối với phiên bản sẽ được sử dụng theo mặc định khi tuần tự hóa và giải tuần tự hóa:

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

T @Bean nên đi vào bất kỳ tệp nào đó được chú thích bằng @Configuration chú thích, và thường nằm trong lớp cấu hình chuyên biệt hoặc lớp chính của ứng dụng Spring Boot.

Thay đổi phiên bản Jackson2ObjectMapperBuilder

Mùa xuân sử dụng HttpMessageConverters để chuyển đổi giữa các thông điệp HTTP và các đối tượng. Các trình chuyển đổi mặc định là ObjectMapperXmlMapper các phiên bản được khởi tạo thông qua Jackson2ObjectMapperBuilder.

Thay vì cung cấp thủ công ObjectMapper (thay thế cái được cung cấp bởi người xây dựng), bạn có thể hướng dẫn Spring về làm thế nào để xây dựng thay vào đó, trình ánh xạ đối tượng. Điều này cho phép Spring thực hiện các cấu hình cấp cao mà bạn không cần can thiệp vào các đối tượng cấp thấp hơn, trong khi vẫn tùy chỉnh cách thức hoạt động của nó. Ngoài ra, bạn cũng có thể tùy chỉnh XmlMapper theo cách này trong một lần.

Để tùy chỉnh trình tạo, bạn đăng ký @Bean of Jackson2ObjectMapperBuilderCustomizer gõ, tùy chỉnh và trả về trình tạo:

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

@JsonBao gồm chú thích

Ở đầu bên kia của quang phổ, chúng ta có thể sử dụng chú thích, như một giải pháp thay thế mã thấp! Chú thích có thể được áp dụng ở cấp lớp hoặc cấp phương pháp:

@JsonInclude(JsonInclude.Include.NON_NULL)

Điều này cho phép bạn chỉ tùy chỉnh các lớp nhất định, thay vì hành vi chung của trình ánh xạ đối tượng.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Lưu ý: Kể từ Jackson 2.0, giá trị của chú thích là JsonInclude.Include.NON_NULL. Đối với các phiên bản trước đó, hãy sử dụng include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude ở Cấp độ lớp học

Khi bạn nộp đơn @JsonInclude ở cấp lớp, chú thích mở rộng cho tất cả các getters và setters:

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

Bất kỳ trường nhất định nào có null giá trị sẽ không được tuần tự hóa.

@JsonInclude ở cấp phương pháp

Ngoài ra, bạn có thể áp dụng chú thích ở cấp phương pháp làm tùy chọn chi tiết nhất:

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

Trong đoạn mã này – chú thích chỉ được áp dụng cho TransactionType trường.

Kết luận

Trong hướng dẫn này, bạn đã học cách bỏ qua các trường rỗng trong Jackson bằng Java và Spring Boot. Điều này có thể đạt được trên toàn cầu bằng cách thay thế tiềm ẩn cơ bản ObjectMapper thể hiện và tùy chỉnh hành vi của bean chính mới mà bạn đăng ký.

Ngoài ra, bạn có thể tùy chỉnh Jackson2ObjectMapperBuilder điều đó xây dựng ObjectMapper cho ứng dụng của bạn thay vì thay thế ứng dụng đã được xây dựng sẵn. Đối với giải pháp mã thấp – bạn có thể thay đổi spring.jackson.default-property-inclusion tài sản trong các tệp thuộc tính của bạn.

Cuối cùng – bạn có thể sử dụng @JsonInclude chú thích ở cấp độ lớp hoặc cấp phương thức.

Dấu thời gian:

Thêm từ xếp chồng lên nhau