Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 833
Danubian Sailor Avatar asked May 18 '12 09:05

Danubian Sailor


People also ask

What is an HttpMessageConverter in spring rest?

HttpMessageConverter is a strategy interface that specifies a converter that can convert from and to HTTP requests and responses in Spring REST Restful web services. Internally Spring MVC uses it to convert the Http request to an object representation and back.

What is the use of WebMvcConfigurer?

Interface WebMvcConfigurer. Defines callback methods to customize the Java-based configuration for Spring MVC enabled via @EnableWebMvc . @EnableWebMvc -annotated configuration classes may implement this interface to be called back and given a chance to customize the default configuration.


1 Answers

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.

like image 87
Tomasz Nurkiewicz Avatar answered Oct 01 '22 00:10

Tomasz Nurkiewicz