Ignorar campos nulos com Jackson em Java e Spring Boot

Valores nulos surgem muito no desenvolvimento de software, e o manuseio adequado de null valores podem ser transformados em uma ciência em si. Jackson é a biblioteca de fato para serialização e desserialização de objetos Java – e um cenário comum refere-se à serialização de objetos que têm null Campos.

Neste breve tutorial, veremos como você pode ignorar campos nulos ao serializar um POJO com Jackson.

Alterando as configurações do ObjectMapper

O ObjectMapper de Jackson é a API central que mapeia objetos para valores serializados. Naturalmente, você pode ajustar e personalizar a forma como funciona através de vários sinalizadores, um dos quais é:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Ao serializar com este mapeador, as propriedades só serão incluídas se não forem nulas.

Isso define a bandeira de modo global para qualquer objeto sendo serializado com o objectMapper instância. Se você estiver trabalhando com o Spring Boot e o ObjectMapper em que está confiando não estiver exposto, você poderá alterar o sinalizador no application.properties arquivo:

spring.jackson.default-property-inclusion = non_null

Ou, se você estiver usando application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Observação: Versões mais antigas do Spring usadas spring.jackson.serialization-inclusion=non_null em vez de spring.jackson.default-property-inclusion=non_null.

Alternativamente, você pode descascar substituir o padrão ObjectMapper instância registrando um novo @Primary @Bean, com o nome objectMapper(), que substitui a implementação padrão e permite a personalização completa da instância que será usada por padrão ao serializar e desserializar:

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

Esta @Bean deve entrar qualquer arquivo que está anotado com o @Configuration anotação, e muitas vezes está situado em uma classe de configuração especializada ou na classe principal do aplicativo Spring Boot.

Alterando a instância Jackson2ObjectMapperBuilder

A primavera usa o HttpMessageConverters para converter entre mensagens HTTP e objetos. Os conversores padrão são os ObjectMapper e XmlMapper instâncias instanciadas através do Jackson2ObjectMapperBuilder.

Em vez de fornecer manualmente o principal ObjectMapper (substituindo o fornecido pelo construtor), você pode instruir o Spring sobre como construir o mapeador de objetos em vez disso. Isso permite que o Spring faça suas configurações de alto nível sem que você adultere os objetos de nível inferior, enquanto ainda personaliza a maneira como ele funciona. Além disso, você também pode personalizar o XmlMapper desta forma de uma só vez.

Para personalizar o construtor, você registra um novo @Bean of Jackson2ObjectMapperBuilderCustomizer type, que customiza e retorna o construtor:

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

@JsonInclude Anotação

Na outra ponta do espectro, podemos usar anotações, como alternativa low-code! As anotações podem ser aplicadas no nível de classe ou no nível de método:

@JsonInclude(JsonInclude.Include.NON_NULL)

Isso permite que você personalize apenas determinadas classes, em vez do comportamento global do mapeador de objetos.

Confira nosso guia prático e prático para aprender Git, com práticas recomendadas, padrões aceitos pelo setor e folha de dicas incluída. Pare de pesquisar comandos Git no Google e realmente aprender -lo!

Observação: A partir de Jackson 2.0, o valor da anotação é JsonInclude.Include.NON_NULL. Para versões anteriores, use include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude no nível de classe

Quando você aplica @JsonInclude no nível de classe, a anotação se estende a todos os getters e 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;
    
    
}

Qualquer campo que tenha um null valor não será serializado.

@JsonInclude no nível do método

Como alternativa, você pode aplicar a anotação no nível do método como a opção mais 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;
    
    
}

Neste trecho – a anotação é aplicada apenas ao TransactionType campo.

Conclusão

Neste guia, você aprendeu como ignorar campos nulos em Jackson, com Java e Spring Boot. Isso pode ser alcançado globalmente substituindo o implícito subjacente ObjectMapper instância e customizando o comportamento do novo bean primário que você registra.

Alternativamente, você pode personalizar o Jackson2ObjectMapperBuilder que constrói o ObjectMapper para seu aplicativo em vez de substituir o já construído. Para uma solução low-code – você pode alterar o spring.jackson.default-property-inclusion propriedade em seus arquivos de propriedades.

Finalmente - você pode usar o @JsonInclude anotação em nível de classe ou nível de método.

Carimbo de hora:

Mais de Abuso de pilha