Ignora i campi Null con Jackson in Java e Spring Boot

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.

Timestamp:

Di più da Impilamento