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.