Logotipo de Zephyrnet

Ignorar campos nulos con Jackson en Java y Spring Boot

Fecha:

Los valores nulos surgen mucho en el desarrollo de software y el manejo adecuado de null los valores pueden convertirse en una ciencia en sí misma. Jackson es la biblioteca de facto para la serialización y deserialización de objetos Java, y un escenario común se refiere a la serialización de objetos que tienen null campos.

En este breve tutorial, veremos cómo puede ignorar los campos nulos al serializar un POJO con Jackson.

Cambiar la configuración de ObjectMapper

ObjectMapper de Jackson es la API central que asigna objetos a valores serializados. Naturalmente, puede ajustar y personalizar la forma en que funciona a través de varias banderas, una de las cuales es:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Al serializar con este asignador, las propiedades solo se incluirán si no son nulas.

Esto pone la bandera a nivel mundial para cualquier objeto que se serializa con el objectMapper instancia. Si está trabajando con Spring Boot y el ObjectMapper en el que se basa no está expuesto, puede modificar el indicador en el application.properties archivo:

spring.jackson.default-property-inclusion = non_null

O, si está usando application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Nota: Versiones anteriores de Spring usadas spring.jackson.serialization-inclusion=non_null en lugar de spring.jackson.default-property-inclusion=non_null.

Alternativamente, puede despegar y reemplazar el valor predeterminado ObjectMapper instancia registrando una nueva @Primary @Bean, llamado objectMapper(), que anula la implementación predeterminada y permite una personalización completa de la instancia que se utilizará de forma predeterminada al serializar y deserializar:

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

Este @Bean debería entrar en cualquier archivo que está anotado con el @Configuration anotación y, a menudo, se encuentra en una clase de configuración especializada o en la clase principal de la aplicación Spring Boot.

Cambiar la instancia de Jackson2ObjectMapperBuilder

Spring usa el HttpMessageConverters para convertir entre mensajes HTTP y objetos. Los convertidores predeterminados son los ObjectMapper y XmlMapper instancias instanciadas a través de Jackson2ObjectMapperBuilder.

En lugar de proporcionar manualmente el principal ObjectMapper (reemplazando el provisto por el constructor), puede instruir a Spring en cómo construir el mapeador de objetos en su lugar. Esto permite que Spring realice sus configuraciones de alto nivel sin que usted manipule los objetos de nivel inferior, mientras sigue personalizando la forma en que funciona. Además, también puede personalizar el XmlMapper de esta manera de una vez.

Para personalizar el constructor, registra un nuevo @Bean of Jackson2ObjectMapperBuilderCustomizer type, que personaliza y devuelve el constructor:

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

@JsonIncluir anotación

En el otro extremo del espectro, podemos usar anotaciones, ¡como una alternativa de código bajo! Las anotaciones se pueden aplicar a nivel de clase o de método:

@JsonInclude(JsonInclude.Include.NON_NULL)

Esto le permite personalizar solo ciertas clases, en lugar del comportamiento global del mapeador de objetos.

Consulte nuestra guía práctica y práctica para aprender Git, con las mejores prácticas, los estándares aceptados por la industria y la hoja de trucos incluida. Deja de buscar en Google los comandos de Git y, de hecho, aprenden ella!

Nota: A partir de Jackson 2.0, el valor de la anotación es JsonInclude.Include.NON_NULL. Para versiones anteriores, utilice include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude en el nivel de clase

Cuando apliques @JsonInclude a nivel de clase, la anotación se extiende a todos los getters y 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;
    
    
}

Cualquier campo dado que tenga un null el valor no se serializará.

@JsonInclude en el nivel de método

Alternativamente, puede aplicar la anotación a nivel de método como la opción más 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;
    
    
}

En este fragmento, la anotación solo se aplica al TransactionType campo.

Conclusión

En esta guía, ha aprendido a ignorar campos nulos en Jackson, con Java y Spring Boot. Esto se puede lograr globalmente reemplazando el implícito subyacente ObjectMapper instancia y personalizar el comportamiento del nuevo bean primario que registre.

Alternativamente, puede personalizar el Jackson2ObjectMapperBuilder que construye el ObjectMapper para su aplicación en lugar de reemplazar la ya construida. Para una solución de código bajo, puede cambiar el spring.jackson.default-property-inclusion propiedad en sus archivos de propiedades.

Por último, puede utilizar el @JsonInclude anotación en el nivel de clase o en el nivel de método.

punto_img

Información más reciente

punto_img