Configuring a Custom ObjectMapper for Spring RestTemplate

One of the great things about RestTemplate is its simplicity. You simply instantiate it like this… RestTemplate restTemplate = new RestTemplate(); and off you go. Under the hood Spring automatically creates and registers a number of message converters to handle various data formats for requests and responses.  A MappingJackson2HttpMessageConverter uses Jackson to map POJOs to JSON and vice versa. When the MappingJackson2HttpMessageConverter is created it’s given a new instance of ObjectMapper. A default instance of ObjectMapper is fine is many case but there are times when you might want to customise the ObjectMapper used.  For example, I ran into an issue recently where I needed to configure Jackson to accept case insensitive properties like this.

private ObjectMapper createObjectMapper() {

     ObjectMapper objectMapper = new ObjectMapper();
     objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
     return objectMapper;

To make the custom ObjectMapper available to MappingJackson2HttpMessageConverter simply create a new MappingJackson2HttpMessageConverter and pass in the ObjectMapper instance.

private MappingJackson2HttpMessageConverter createMappingJacksonHttpMessageConverter() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    return converter;

Then you can create a RestTemplate and add your custom MappingJackson2HttpMessageConverter to its list of message converters.

public RestTemplate createRestTemplate() {
     RestTemplate restTemplate = new RestTemplate();
     restTemplate.getMessageConverters().add(0, createMappingJacksonHttpMessageConverter());

Note that you should add it to the beginning of the list so that it takes precedence over the default MappingJackson2HttpMessageConverter that Spring has already registered.