Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can we configure the internal Jackson mapper when using RestTemplate?

Tags:

spring

jackson

I want to update the SerializationConfig.Feature... properties of the jackson mapper used by Spring RestTemplate, Any idea how I can get to it or where I can/should configure it.

like image 374
Usman Ismail Avatar asked Feb 21 '12 16:02

Usman Ismail


People also ask

Does RestTemplate use Jackson?

The RestTemplate uses the Jackson to create a Jackson java bean from the provided JSON. This bean is returned to the DataProvider. The DataProvider maps the Jackson bean to our own java bean, the data bean, and returns this to the calling application.

How does Jackson work in spring boot?

Spring Boot and Jackson The above dependency declaration will work for other Java projects, but in a Spring Boot application, you may encounter errors such as this. The Spring Boot parent POM includes Jackson dependencies. When you include the version number, it overrides the Spring Boot curated dependency versions.

How do you use RestTemplate getForObject?

The getForObject method fetches the data for the given response type from the given URI or URL template using HTTP GET method. To fetch data for the given key properties from URL template we can pass Object Varargs and Map to getForObject method. The getForObject returns directly the object of given response type.


2 Answers

The default RestTemplate constructor registers a set of HttpMessageConverters:

this.messageConverters.add(new ByteArrayHttpMessageConverter()); this.messageConverters.add(new StringHttpMessageConverter()); this.messageConverters.add(new ResourceHttpMessageConverter()); this.messageConverters.add(new SourceHttpMessageConverter()); this.messageConverters.add(new XmlAwareFormHttpMessageConverter()); if (jaxb2Present) {     this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); } if (jacksonPresent) {     this.messageConverters.add(new MappingJacksonHttpMessageConverter()); } if (romePresent) {     this.messageConverters.add(new AtomFeedHttpMessageConverter());     this.messageConverters.add(new RssChannelHttpMessageConverter()); } 

The MappingJacksonHttpMessageConverter in turns, creates ObjectMapper instance directly. You can either find this converter and replace ObjectMapper or register a new one before it. This should work:

@Bean public RestOperations restOperations() {     RestTemplate rest = new RestTemplate();     //this is crucial!     rest.getMessageConverters().add(0, mappingJacksonHttpMessageConverter());     return rest; }  @Bean public MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {     MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();     converter.setObjectMapper(myObjectMapper());     return converter; }  @Bean public ObjectMapper myObjectMapper() {     //your custom ObjectMapper here } 

In XML it is something along these lines:

<bean id="restOperations" class="org.springframework.web.client.RestTemplate">     <property name="messageConverters">         <util:list>             <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>             <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>             <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>             <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>             <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>             <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>             <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">                 <property name="objectMapper" ref="customObjectMapper"/>             </bean>         </util:list>     </property> </bean>  <bean id="customObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/> 

Note that the transition isn't really 1:1 - I have to explicitly create messageConverters list in XML while with @Configuration approach I could reference existing one and simply modify it. But this should work.

like image 102
Tomasz Nurkiewicz Avatar answered Sep 24 '22 03:09

Tomasz Nurkiewicz


If you are not using Spring IOC, you can do something like this (Java 8):

ObjectMapper objectMapper = new ObjectMapper(); // configure your ObjectMapper here  RestTemplate restTemplate = new RestTemplate();      MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); messageConverter.setPrettyPrint(false); messageConverter.setObjectMapper(objectMapper); restTemplate.getMessageConverters().removeIf(m -> m.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName())); restTemplate.getMessageConverters().add(messageConverter); 
like image 41
Matt Sidesinger Avatar answered Sep 24 '22 03:09

Matt Sidesinger