How to configure MappingJacksonHttpMessageConverter while using spring annotation-based configuration?

annotations, jackson, java, spring, spring-mvc

Solution

Use the `WebMvcConfigurer.configureMessageConverters()` method:

Configure the HttpMessageConverters to use [...] If no message converters are added to the list, default converters are added instead.

With `@Configuration` you have:

@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;
    }
}

Call to `addDefaultHttpMessageConverters()` is required because the defaults are not applied when using custom converters.

IMPORTANT NOTE You must remove `@EnableWebMvc` for your converters to be configured if you extend WebMvcConfigurationSupport.

Problem

I was unreasonable enough to went into configuring spring beans via annotations and not pure xml beans and now I'm facing the consequences. I configure REST channels using ``` <mvc:annotation-driven /> ``` Now I want simply configure the `MappingJacksonHttpMessageConverter` to output to JSON only this fields that have non-null values. I've tried the following: ``` <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> ``` The beans gets created, but another instance of converter is created and used in channels. So I've tried the way with `@Configuration` and `@Bean` described in this Stackoverflow question, but still json serialization uses its own configuration. Finally I've tried to inject the mapper via ``` @Autowired private MappingJacksonHttpMessageConverter jacksonConverter; ``` but I've ended with `NoSuchBeanDefinitionException`. So now I'm out of options and therefore I'm asking for any ideas here. How to controll and configure the mapper used by framework?

Original source

Related problems