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.