jackson2 JSON ISO 8601 date from JodaTime in Spring 3.2RC1
Or, if you prefer doing your configuration in Java, it could look like this:
@Configuration@EnableWebMvcpublic class RestConfig extends WebMvcConfigurerAdapter { private ObjectMapper objectMapper() { Jackson2ObjectMapperFactoryBean bean = new Jackson2ObjectMapperFactoryBean(); bean.setIndentOutput(true); bean.setSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); bean.afterPropertiesSet(); ObjectMapper objectMapper = bean.getObject(); objectMapper.registerModule(new JodaModule()); return objectMapper; } private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(objectMapper()); return converter; } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(mappingJackson2HttpMessageConverter()); }}
I eventually got it working using jackson-datatype-joda:
Add another Maven dependency (match your Jackson version number):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-joda</artifactId> <version>${jackson.version}</version></dependency>
Then register the JodaModule (which handles the conversion) to Jackson's ObjectMapper (here done in Spring, but you could create a helper class):
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetObject-ref="objectMapper" p:targetMethod="registerModule"> <property name="arguments"> <list><bean class="com.fasterxml.jackson.datatype.joda.JodaModule"/></list> </property></bean>
(You'll need to give the ObjectMapper an id so that it can be referenced in this way).
The Hibernate module is also registered in this way: https://github.com/FasterXML/jackson-module-hibernate
Note that you need to set a (Simple)DateFormat as shown in the question, but disabling SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS
didn't seem to make any difference.
Just to sum up answers and post working solution for JodaTime serialization in Spring (tested on Spring 3.2)
spring-context.xml
<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ"></bean><bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetObject-ref="objectMapper" p:targetMethod="registerModule"> <property name="arguments"> <list> <bean class="com.fasterxml.jackson.datatype.joda.JodaModule" /> </list> </property></bean><mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" /> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" ref="objectMapper" /> </bean> </mvc:message-converters></mvc:annotation-driven>
Maven dependencies (com.fasterxml.jackson-version is 2.1.1)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${com.fasterxml.jackson-version}</version></dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${com.fasterxml.jackson-version}</version></dependency><dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-joda</artifactId> <version>${com.fasterxml.jackson-version}</version></dependency>
After this your JodaTime fields in ResponseBody will be automatically serialized in JSON as "createdDate" : "2013-01-18T15:15:36.365+02:00"