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.