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.