Estoy usando Spring Boot (1.2.1), de manera similar a su tutorial de Construcción de un servicio web RESTful :
@RestController
public class EventController {
@RequestMapping("/events/all")
EventList events() {
return proxyService.getAllEvents();
}
}
Así que arriba, Spring MVC usa implícitamente a Jackson para serializar mi EventList
objeto en JSON.
Pero quiero hacer algunas personalizaciones simples al formato JSON, como:
setSerializationInclusion(JsonInclude.Include.NON_NULL)
La pregunta es, ¿cuál es la forma más sencilla de personalizar el asignador JSON implícito?
Probé el enfoque en esta publicación de blog , creando un CustomObjectMapper y así sucesivamente, pero el paso 3, "Registrar clases en el contexto de Spring", falla:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'jacksonFix': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire method: public void com.acme.project.JacksonFix.setAnnotationMethodHandlerAdapter(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter);
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]
found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
Parece que esas instrucciones son para versiones anteriores de Spring MVC, mientras que estoy buscando una forma sencilla de hacer que esto funcione con la última versión de Spring Boot.
java
spring
spring-mvc
jackson
spring-boot
Jonik
fuente
fuente
Respuestas:
Si está utilizando Spring Boot 1.3, puede configurar la inclusión de serialización a través de
application.properties
:Tras los cambios en Jackson 2.7, Spring Boot 1.4 usa una propiedad denominada
spring.jackson.default-property-inclusion
en su lugar:Consulte la sección " Personalizar Jackson ObjectMapper " en la documentación de Spring Boot.
Si está utilizando una versión anterior de Spring Boot, la forma más fácil de configurar la inclusión de serialización en Spring Boot es declarar su propio
Jackson2ObjectMapperBuilder
bean configurado apropiadamente . Por ejemplo:fuente
@ComponentScan
,@EnableAutoConfiguration
etc.)?@Configuration
clase de su aplicación. LaApplication
clase principal es un buen lugar para ello.Estoy respondiendo un poco tarde a esta pregunta, pero alguien, en el futuro, podría encontrar esto útil. El siguiente enfoque, además de muchos otros enfoques, funciona mejor y, personalmente, creo que se adaptaría mejor a una aplicación web.
fuente
WebMvcConfigurer
Se pueden configurar muchas cosas en las propiedades de la aplicación. Desafortunadamente, esta función solo en la versión 1.3, pero puede agregar una clase de configuración
[ACTUALIZACIÓN: Debe trabajar en ObjectMapper porque
build()
se llama al método-antes de que se ejecute la configuración].fuente
La documentación indica varias formas de hacer esto.
fuente
ObjectMapper
? Me refiero a mantener el valor predeterminado también como personalizado.Puede agregar un método siguiente dentro de su clase de arranque que está anotado con
@SpringBootApplication
fuente
spring.jackson.serialization-inclusion=non_null
solía trabajar para nosotrosPero cuando actualizamos la versión de Spring Boot a 1.4.2.RELEASE o superior, dejó de funcionar.
Ahora, otra propiedad
spring.jackson.default-property-inclusion=non_null
está haciendo la magia.de hecho,
serialization-inclusion
está en desuso. Esto es lo que me arroja mi intellij.Entonces, comience a usar en su
spring.jackson.default-property-inclusion=non_null
lugarfuente
Me encontré con otra solución, que es bastante agradable.
Básicamente, solo realice el paso 2 del blog publicado mencionado y defina un ObjectMapper personalizado como Spring
@Component
. (Las cosas comenzaron a funcionar cuando acabo de eliminar todo el material AnnotationMethodHandlerAdapter del paso 3.)Funciona siempre que el componente esté en un paquete escaneado por Spring. (El uso
@Primary
no es obligatorio en mi caso, pero ¿por qué no hacer las cosas explícitas?)Para mí, hay dos beneficios en comparación con el otro enfoque:
Jackson2ObjectMapperBuilder
.new CustomObjectMapper()
lugar denew ObjectMapper()
.fuente
ObjectMapper
instancia creada o configurada por Spring Boot.@RestController
clases que actualmente me es suficiente. (¿Quiere decir que esas instancias son creadas por Spring MVC, no Spring Boot?) Pero si me encuentro con otros casos en los que se deben crear instancias de ObjectMappers, ¡tendré en cuenta el enfoque Jackson2ObjectMapperBuilder!Cuando intenté hacer ObjectMapper principal en Spring Boot 2.0.6, obtuve errores, así que modifiqué el que Spring Boot creó para mí.
También vea https://stackoverflow.com/a/48519868/255139
fuente
Encontré la solución descrita anteriormente con:
spring.jackson.serialization-inclusión = non_null
Solo funciona a partir de la versión 1.4.0.RELEASE de spring boot. En todos los demás casos, se ignora la configuración.
Verifiqué esto experimentando con una modificación de la muestra de arranque de primavera "spring-boot-sample-jersey"
fuente
Conozco la pregunta sobre el arranque de primavera, pero creo que mucha gente busca cómo hacer esto en un arranque que no sea de primavera, como yo buscando casi todo el día.
Por encima de Spring 4, no es necesario configurar
MappingJacksonHttpMessageConverter
si solo tiene la intención de configurarObjectMapper
.Solo necesitas hacer:
Y en su configuración de Spring, cree este bean:
fuente