I valori nulli sorgono molto nello sviluppo del software e nella corretta gestione di null
i valori possono essere trasformati in una scienza in sé e per sé. Jackson è la libreria de facto per la serializzazione e la deserializzazione di oggetti Java e uno scenario comune riguarda la serializzazione di oggetti che hanno null
campi.
In questo breve tutorial, daremo un'occhiata a come ignorare i campi null durante la serializzazione di un POJO con Jackson.
Modifica delle impostazioni di ObjectMapper
L'ObjectMapper di Jackson è l'API centrale che associa gli oggetti ai valori serializzati. Naturalmente, puoi regolare e personalizzare il modo in cui funziona attraverso vari flag, uno dei quali è:
objectMapper.setSerializationInclusion(Include.NON_NULL);
Durante la serializzazione con questo mapper, le proprietà verranno incluse solo se non sono nulle.
Questo imposta la bandiera a livello globale per qualsiasi oggetto serializzato con objectMapper
esempio. Se stai lavorando con Spring Boot e l'ObjectMapper su cui fa affidamento non è esposto, puoi modificare il flag nel application.properties
file:
spring.jackson.default-property-inclusion = non_null
Oppure, se stai usando application.yml
:
spring:
jackson:
default-property-inclusion: non_null
Nota: Sono state utilizzate versioni precedenti di Spring spring.jackson.serialization-inclusion=non_null
invece di spring.jackson.default-property-inclusion=non_null
.
In alternativa, puoi rimuovere l'impostazione predefinita ObjectMapper
istanza registrandone una nuova @Primary
@Bean
, Di nome objectMapper()
, che sovrascrive l'implementazione predefinita e consente la personalizzazione completa sull'istanza che verrà utilizzata per impostazione predefinita durante la serializzazione e la deserializzazione:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
La sezione @Bean
dovrebbe entrare qualsiasi file che è annotato con il @Configuration
annotazione, e spesso si trova in una classe di configurazione specializzata o nella classe principale dell'applicazione Spring Boot.
Modifica dell'istanza Jackson2ObjectMapperBuilder
La primavera usa il HttpMessageConverters
per convertire tra messaggi HTTP e oggetti. I convertitori predefiniti sono i ObjectMapper
ed XmlMapper
istanze istanziate tramite il Jackson2ObjectMapperBuilder
.
Invece di fornire manualmente il primario ObjectMapper
(sostituendo quello fornito dal costruttore), è possibile istruire Spring on come costruire invece il mappatore di oggetti. Ciò consente a Spring di eseguire le sue configurazioni di alto livello senza che tu manometta gli oggetti di livello inferiore, pur continuando a personalizzare il modo in cui funziona. Inoltre, puoi anche personalizzare il XmlMapper
in questo modo in una volta sola.
Per personalizzare il builder, ne registri uno nuovo @Bean
of Jackson2ObjectMapperBuilderCustomizer
type, che personalizza e restituisce il builder:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@JsonInclude Annotazione
Dall'altra parte dello spettro, possiamo usare le annotazioni, come alternativa a basso codice! Le annotazioni possono essere applicate a livello di classe o di metodo:
@JsonInclude(JsonInclude.Include.NON_NULL)
Ciò consente di personalizzare solo determinate classi, invece del comportamento globale del mappatore di oggetti.
Dai un'occhiata alla nostra guida pratica e pratica per l'apprendimento di Git, con le migliori pratiche, gli standard accettati dal settore e il cheat sheet incluso. Smetti di cercare su Google i comandi Git e in realtà imparare esso!
Nota: A partire da Jackson 2.0, il valore dell'annotazione è JsonInclude.Include.NON_NULL
. Per le versioni precedenti, utilizzare include=JsonSerialize.Inclusion.NON_NULL
.
@JsonInclude a livello di classe
Quando si applica @JsonInclude
a livello di classe, l'annotazione si estende a tutti i getter e setter:
@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;
}
Qualsiasi campo dato che ha a null
il valore non verrà serializzato.
@JsonInclude a livello di metodo
In alternativa, puoi applicare l'annotazione a livello di metodo come opzione più granulare:
@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;
}
In questo frammento, l'annotazione viene applicata solo al file TransactionType
campo.
Conclusione
In questa guida, hai imparato come ignorare i campi null in Jackson, con Java e Spring Boot. Ciò può essere ottenuto globalmente sostituendo l'implicito sottostante ObjectMapper
istanza e personalizzando il comportamento del nuovo bean primario registrato.
In alternativa, puoi personalizzare il Jackson2ObjectMapperBuilder
che costruisce il ObjectMapper
per la tua applicazione invece di sostituire quella già costruita. Per una soluzione low-code, puoi cambiare il spring.jackson.default-property-inclusion
proprietà nei file delle proprietà.
Infine, puoi usare il @JsonInclude
annotazione a livello di classe o di metodo.