Ignorați câmpurile nule cu Jackson în Java și Spring Boot

Valorile nule apar foarte mult în dezvoltarea de software și în manipularea corectă a acestora null valorile pot fi transformate într-o știință în sine. Jackson este biblioteca de facto pentru serializarea și deserializarea obiectelor Java - și un scenariu comun se referă la serializarea obiectelor care au null domenii.

În acest scurt tutorial, vom arunca o privire la modul în care puteți ignora câmpurile nule atunci când serializați un POJO cu Jackson.

Modificarea setărilor ObjectMapper

Jackson's ObjectMapper este API-ul central care mapează obiectele la valori seriate. Desigur, puteți ajusta și personaliza modul în care funcționează prin diferite steaguri, dintre care unul este:

objectMapper.setSerializationInclusion(Include.NON_NULL);

La serializarea cu acest mapper, proprietățile vor fi incluse numai dacă nu sunt nule.

Aceasta stabilește steagul la nivel global pentru orice obiect serializat cu objectMapper instanță. Dacă lucrați cu Spring Boot și ObjectMapper-ul pe care se bazează nu este expus, puteți modifica steagul în application.properties fișier:

spring.jackson.default-property-inclusion = non_null

Sau, dacă folosești application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Notă: S-au folosit versiuni mai vechi de Spring spring.jackson.serialization-inclusion=non_null în loc de spring.jackson.default-property-inclusion=non_null.

Alternativ, puteți dezlipi înapoi înlocui implicit ObjectMapper exemplu prin înregistrarea unui nou @Primary @Bean, numit objectMapper(), care înlocuiește implementarea implicită și permite personalizarea completă a instanței care va fi utilizată în mod implicit la serializare și deserializare:

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

Acest @Bean ar trebui să intre în orice dosar care este adnotat cu @Configuration adnotare și este adesea situat fie într-o clasă de configurare specializată, fie în clasa principală a aplicației Spring Boot.

Modificarea instanței Jackson2ObjectMapperBuilder

Primavara foloseste HttpMessageConverters pentru a converti între mesaje HTTP și obiecte. Convertoarele implicite sunt ObjectMapper și XmlMapper instanțe instanțiate prin intermediul Jackson2ObjectMapperBuilder.

În loc să furnizați manual primarul ObjectMapper (inlocuindu-l pe cel pus la dispozitie de constructor), il puteti indruma pe Spring cum sa construiesti în schimb mapatorul de obiecte. Acest lucru îi permite lui Spring să-și facă configurațiile de nivel înalt fără să modificați obiectele de la nivel inferior, personalizând în același timp modul în care funcționează. În plus, puteți personaliza și XmlMapper în acest fel dintr-o singură mişcare.

Pentru a personaliza constructorul, înregistrați un nou @Bean of Jackson2ObjectMapperBuilderCustomizer tip, care personalizează și returnează constructorul:

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

@JsonInclude Adnotare

La celălalt capăt al spectrului, putem folosi adnotări, ca alternativă low-code! Adnotările pot fi aplicate la nivel de clasă sau la nivel de metodă:

@JsonInclude(JsonInclude.Include.NON_NULL)

Acest lucru vă permite să personalizați numai anumite clase, în loc de comportamentul global al mapperului de obiecte.

Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!

Notă: Începând cu Jackson 2.0, valoarea adnotării este JsonInclude.Include.NON_NULL. Pentru versiunile anterioare, utilizați include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude la nivel de clasă

Când aplicați @JsonInclude la nivel de clasă, adnotarea se extinde la toți getters și 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;
    
    
}

Orice câmp dat care are un null valoarea nu va fi serializată.

@JsonInclude la nivel de metodă

Alternativ, puteți aplica adnotarea la nivel de metodă ca opțiune cea mai granulară:

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

În acest fragment – ​​adnotarea este aplicată numai la TransactionType camp.

Concluzie

În acest ghid, ați învățat cum să ignorați câmpurile nule în Jackson, cu Java și Spring Boot. Acest lucru poate fi realizat la nivel global, înlocuind implicitul subiacent ObjectMapper instanță și personalizarea comportamentului noului bean primar pe care îl înregistrați.

Alternativ, puteți personaliza Jackson2ObjectMapperBuilder care construiește ObjectMapper pentru aplicația dvs. în loc să o înlocuiți pe cea deja construită. Pentru o soluție low-code – puteți schimba spring.jackson.default-property-inclusion proprietate în fișierele dvs. de proprietăți.

În cele din urmă – puteți utiliza @JsonInclude adnotare la nivel de clasă sau la nivel de metodă.

Timestamp-ul:

Mai mult de la Stackabuse