Cada vez que implementamos una API REST con Spring (Spring Boot) , nos encontramos con el requisito de excluir NULL en la respuesta JSON de la API. Además, puede haber un requisito para externalizar la activación/desactivación de esta característica: Excluir NULLS en la respuesta JSON , lo que permite que el consumidor de la API la personalice según sus necesidades.
En este artículo, resumimos el enfoque que se utilizó para implementar la externalización de ACTIVAR/DESACTIVAR la función mencionada anteriormente utilizando Jackson: una biblioteca basada en Java para serializar o asignar objetos de Java a JSON y viceversa.
Aproximaciones fallidas:
Inicialmente, probamos con los enfoques fácilmente disponibles de Spring Boot, que no tuvieron éxito, como:
- Tener la propiedad spring.jackson.default-property-inclusion en application.properties . Esta propiedad toma valores como: always / non_null / non_absent / non_default / non_empty .
- Ampliar la clase WebMvcConfigurationSupport y personalizar la configuración de Spring Boot, consulte a continuación.
Java
@Configuration class WebMvcConfiguration extends WebMvcConfiguration{ @Override protected void extendsMessageConverters (List<HttpMessageConverter<?>> converters) { for(HttpMessageConverter<?> converter: converters) { if(converter instnceof MappingJackson2HttpMessageConverter) { ObjectMapper mapper = ((MappingJackson2HttpMessageConverter)converter) .getObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); } } }
Ahora, creando una instancia de org.springframework.http.converter.json.Jackson2ObjectMapperBuilderCustomizer , debajo del código dado es para su referencia.
Java
@Bean Public Jackson2ObjectMapperBuilderCustomizer customJackson(){ return new Jackson2ObjectMapperBuilderCustomizer(){ @Override public void customize(Jackson2ObjectMapperBuilder builder){ builder.serializationInclusion(Include.NON_NULL); builder.failonUnknownProperties(false); } }; }
Enfoque exitoso:
Cree un objeto de respuesta JSON, si no se creó. Este es el objeto que, mientras se serializa en JSON, desea la característica ‘ Excluir/Incluir campos nulos ‘ en función de la propiedad en application.properties . Puede ver debajo del objeto Respuesta para su referencia.
Java
public class RegistrationResponse{ @JsonProperty("success") private Boolean success = null; @JsonProperty("message") private String message = null; @JsonProperty("data") private String data = null; @JsonProperty("error_code") private Integer errorCode = null; public RegistrationResponse success(Boolean success){ this.success = success; return this; } @NotNull public Boolean isSuccess(){ return success; } public void setSuccess(Boolean success){ this.success = success; } public RegistrationResponse message(String message){ this.message = message; return this; } @NotNull public String getMessage(){ return message; } public void setMessage(String message){ this.message = message; }
Cree una propiedad con el nombre ‘ config.response.json.format.exclude_null ‘ que puede tomar valores como ‘ true ‘ o ‘ false ‘. El valor ‘ verdadero ‘ significa excluir campos nulos en la respuesta JSON y el valor ‘ falso ‘ significa no excluir campos nulos. Además, vincule esta propiedad a una propiedad de nivel de clase para que se pueda leer el valor. El código proporcionado a continuación es para su referencia.
config.response.json.format.exclude_null = false
@Value("${config.response.json.format.exclude_null}") private boolean toExcludeNull;
Implemente la lógica real para excluir nulos en función del valor de la propiedad global creando una instancia de com.fasterxml.jackson.databind.ObjectMapper .
- Estableciendo la propiedad SerializationInclusion del mapeador creado en Include.NON_NULL si el valor de la propiedad global es verdadero, de lo contrario, configúrelo en Include.ALWAYS .
- Serialice el objeto de respuesta a una string usando el asignador y devuelva la string. Asegúrese de manejar JsonProcessingException .
Veamos a continuación el fragmento de código real que se agregará al construir la respuesta JSON como parte de la implementación de la API.
Java
RegistrationResponse regResp = new RegistrationResponse(); regResp.setSuccess(true); regResp.setErrorCode(null); regResp.setData("testdata"); regResp.setMessage("success"); ObjectMapper mapper = new ObjectMapper() mapper.enable(SerializationFeature.INDENT_OUTPUT); if(toExcludeNull) mapper.setSerializationInclusion(Include.NON_NULL); else mapper.serializationInclusion(Include.ALWAYS); String regRespStr = null; try{ regRespStr = mapper.writeValueAsString(regResp); } catch(JsonProcessingException e) e.printStackTrace(); } System.out.println("Formatted JSON Response:" + regRespStr);
Aquí, regRespStr es la string JSON con exclusión/inclusión NULL aplicada.
También puedes consultar el Repositorio de Github .
Publicación traducida automáticamente
Artículo escrito por mail2praveensunks y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA