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ă.