restcontroller requestmapping mvc ejemplo annotation java spring spring-mvc annotations jackson

requestmapping - java spring jackson



¿Cómo configurar MappingJacksonHttpMessageConverter usando la configuración basada en la anotación de primavera? (2)

No fui lo suficientemente razonable para configurar beans de primavera a través de anotaciones y no granos puros xml y ahora estoy enfrentando las consecuencias.

Configuro canales REST usando

<mvc:annotation-driven />

Ahora simplemente quiero configurar MappingJacksonHttpMessageConverter para enviar a JSON solo estos campos que tienen valores no nulos. He intentado lo siguiente:

<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="prefixJson" value="false" /> <property name="supportedMediaTypes" value="application/json" /> <property name="objectMapper"> <bean class="org.codehaus.jackson.map.ObjectMapper"> <property name="serializationInclusion" value="NON_NULL"/> </bean> </property> </bean>

Se crean los beans, pero se crea otra instancia de convertidor y se usa en los canales. Así que probé el camino con @Configuration y @Bean describen en esta pregunta de Stackoverflow , pero la serialización todavía json usa su propia configuración.

Finalmente, traté de inyectar el mapeador a través de

@Autowired private MappingJacksonHttpMessageConverter jacksonConverter;

pero he terminado con NoSuchBeanDefinitionException . Así que ahora estoy sin opciones y por lo tanto estoy pidiendo cualquier idea aquí. ¿Cómo controlar y configurar el asignador utilizado por el marco?


La personalización de la configuración del servlet mvc de primavera solo en código java se puede realizar de múltiples maneras.

El más simple parece extender su clase anotada WebMvcConfigurerAdapter con WebMvcConfigurerAdapter :

@Configuration @EnableWebMvc public class ApplicationSpringConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters( List<HttpMessageConverter<?>> converters ) { converters.add(converter()); } @Bean MappingJackson2HttpMessageConverter converter() { // [...] } }

Tenga en cuenta que esto se parece mucho al ejemplo proporcionado por la respuesta de Tomasz Nurkiewicz .

Sin embargo, usar WebMvcConfigurationSupport lugar de WebMvcConfigurerAdapter es más apropiado para personalizaciones avanzadas. Ese era el caso si también necesitaba agregar los conversores predeterminados.

Consulte la documentación de Spring Personalización de la configuración proporcionada


Utilice el método WebMvcConfigurer.configureMessageConverters() :

Configure HttpMessageConverters para usar [...] Si no se agregan convertidores de mensajes a la lista, en su lugar se agregan conversores predeterminados.

Con @Configuration tienes:

@Configuration class MvcConf extends WebMvcConfigurationSupport { protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(converter()); addDefaultHttpMessageConverters(converters); } @Bean MappingJacksonHttpMessageConverter converter() { MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter() //do your customizations here... return converter; } }

La llamada a addDefaultHttpMessageConverters() es necesaria porque los valores predeterminados no se aplican cuando se usan convertidores personalizados.

NOTA IMPORTANTE Debe eliminar @EnableWebMvc para que se configuren sus convertidores si extiende WebMvcConfigurationSupport.