Ignorer les champs nuls avec Jackson en Java et Spring Boot

Les valeurs nulles surviennent souvent dans le développement de logiciels, et la bonne gestion des null les valeurs peuvent être transformées en une science en soi. Jackson est la bibliothèque de facto pour la sérialisation et la désérialisation des objets Java - et un scénario courant concerne la sérialisation des objets qui ont null des champs.

Dans ce court tutoriel, nous verrons comment vous pouvez ignorer les champs nuls lors de la sérialisation d'un POJO avec Jackson.

Modification des paramètres d'ObjectMapper

L'ObjectMapper de Jackson est l'API centrale qui mappe les objets aux valeurs sérialisées. Naturellement, vous pouvez ajuster et personnaliser son fonctionnement à travers différents drapeaux, dont l'un est :

objectMapper.setSerializationInclusion(Include.NON_NULL);

Lors de la sérialisation avec ce mappeur, les propriétés ne seront incluses que si elles ne sont pas nulles.

Cela met le drapeau l'échelle mondiale pour tout objet en cours de sérialisation avec le objectMapper exemple. Si vous travaillez avec Spring Boot et que l'ObjectMapper sur lequel il s'appuie n'est pas exposé, vous pouvez modifier l'indicateur dans le application.properties fichier:

spring.jackson.default-property-inclusion = non_null

Ou, si vous utilisez application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Remarque: Anciennes versions de Spring utilisées spring.jackson.serialization-inclusion=non_null au lieu de spring.jackson.default-property-inclusion=non_null.

Alternativement, vous pouvez décoller remplacer la valeur par défaut ObjectMapper instance en enregistrant un nouveau @Primary @Bean, Nommé objectMapper(), qui remplace l'implémentation par défaut et permet une personnalisation complète de l'instance qui sera utilisée par défaut lors de la sérialisation et de la désérialisation :

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

Ce @Bean devrait entrer dans n'importe quel fichier qui est annoté avec le @Configuration annotation, et se trouve souvent soit dans une classe de configuration spécialisée, soit dans la classe principale de l'application Spring Boot.

Modification de l'instance de Jackson2ObjectMapperBuilder

Le printemps utilise le HttpMessageConverters pour convertir entre les messages HTTP et les objets. Les convertisseurs par défaut sont les ObjectMapper et les XmlMapper instances instanciées via le Jackson2ObjectMapperBuilder.

Au lieu de fournir manuellement le principal ObjectMapper (remplaçant celui fourni par le constructeur), vous pouvez demander à Spring de comment construire le mappeur d'objet à la place. Cela permet à Spring de faire ses configurations de haut niveau sans que vous altériez les objets de niveau inférieur, tout en personnalisant son fonctionnement. De plus, vous pouvez également personnaliser le XmlMapper de cette façon en une seule fois.

Pour personnaliser le constructeur, vous enregistrez un nouveau @Bean of Jackson2ObjectMapperBuilderCustomizer type, qui personnalise et renvoie le générateur :

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

@JsonIncludeAnnotation

À l'autre extrémité du spectre, nous pouvons utiliser des annotations, comme alternative low-code ! Les annotations peuvent être appliquées au niveau de la classe ou de la méthode :

@JsonInclude(JsonInclude.Include.NON_NULL)

Cela vous permet de personnaliser uniquement certaines classes, au lieu du comportement global du mappeur d'objets.

Consultez notre guide pratique et pratique pour apprendre Git, avec les meilleures pratiques, les normes acceptées par l'industrie et la feuille de triche incluse. Arrêtez de googler les commandes Git et en fait apprendre il!

Remarque: Depuis Jackson 2.0, la valeur de l'annotation est JsonInclude.Include.NON_NULL. Pour les versions antérieures, utilisez include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude au niveau de la classe

Quand vous postulez @JsonInclude au niveau de la classe, l'annotation s'étend à tous les getters et 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;
    
    
}

Tout champ donné qui a un null la valeur ne sera pas sérialisée.

@JsonInclude au niveau de la méthode

Vous pouvez également appliquer l'annotation au niveau de la méthode en tant qu'option la plus précise :

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

Dans cet extrait, l'annotation s'applique uniquement au TransactionType champ.

Conclusion

Dans ce guide, vous avez appris à ignorer les champs nuls dans Jackson, avec Java et Spring Boot. Ceci peut être réalisé globalement en remplaçant l'implicite sous-jacent ObjectMapper instance et personnaliser le comportement du nouveau bean primaire que vous enregistrez.

Alternativement, vous pouvez personnaliser le Jackson2ObjectMapperBuilder qui construit le ObjectMapper pour votre application au lieu de remplacer celle déjà construite. Pour une solution low-code - vous pouvez changer le spring.jackson.default-property-inclusion propriété dans vos fichiers de propriétés.

Enfin – vous pouvez utiliser le @JsonInclude annotation au niveau de la classe ou de la méthode.

Horodatage:

Plus de Stackabuse