Spring, Jackson and Customization (e.g. CustomDeserializer)

jackson, json, spring, spring-mvc, web-services

Solution

You don't say how you're using Jackson in Spring, so I'll assume you're using it through `<mvc:annotation-driven/>` and the `@RequestBody` and/or `@ResponseBody` annotations.

One of the things that `<mvc:annotation-driven/>` does is to register a `AnnotationMethodHandlerAdapter` bean which comes with a number of pre-configured `HttpMessageConverter` beans, including `MappingJacksonHttpMessageConverter`, which handles marshalling to and from Jackson-annotated model classes.

Now `MappingJacksonHttpMessageConverter` has a `setObjectMapper()` method, which allows you to override the default `ObjectMapper`. But since `MappingJacksonHttpMessageConverter` is created behind the scenes by `<mvc:annotation-driven/>`, you can't get to it.

However, `<mvc:annotation-driven/>` is just a convenient short-cut. It's just as a valid to declare your own `AnnotationMethodHandlerAdapter` bean, injecting into it your own `MappingJacksonHttpMessageConverter` bean (via the `messageConverters` property), and injecting your own customized `ObjectMapper` into that.

You then have the problem of how to build a custom `ObjectMapper`, since it's not a very Spring-friendly class. I suggest writing your own simple implementation of `FactoryBean`.

So you'd end up with something like this:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
   <property name="messageConverters">
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
         <property name="objectMapper">
            <bean class="com.x.MyObjectMapperFactoryBean"/>
         </property>
      </bean>
   </property>
</bean>

Problem

Being still a little unfamiliar with Spring, I have encountered a problem that makes it necessary implementing my a custom deserialzer for Jackson. The procedure is described in a small tutorial, however, I am stuck with Spring. I do not understand, where ``` ObjectMapper mapper = new ObjectMapper(); ``` in Spring MVC is carried out when json is deserializes by a method of a controller class. So I do not know, what to do in order to replace the default deserializer by a custom deserialiser. Any suggestions most welcome.

Original source