我正在使用Spring MVC 3.2RC1中的REST API。
我正在获取一个带有org.joda.time.DateTime时间戳的JPA实体,并让Spring使用
将其序列化为JSON@RequestMapping(value = "/foobar", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
在Spring中使用默认的Jackson2设置,因为我只添加了
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.1</version>
</dependency>
到我的POM,让Spring自己连接它。
控制器正在生成:
"created":{"year":2012,"dayOfMonth":30,"dayOfWeek":5,"era":1,"dayOfYear":335,"weekOfWeekyear":48,"weekyear":2012,"monthOfYear":11,"yearOfEra":2012,"yearOfCentury":12,"centuryOfEra":20,"millisOfSecond":39,"millisOfDay":52684039,"secondOfMinute":4,"secondOfDay":52684,"minuteOfHour":38,"minuteOfDay":878,"hourOfDay":14,"millis":1354282684039,"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"},"chronology":{"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"}},"afterNow":false,"beforeNow":true,"equalNow":false}
但我希望它和ISO8601日期如2007-11-16T20:14:06.3Z(或带偏移量)。
我的猜测是我需要访问ObjectMapper并设置mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);但是如何在使用
时访问ObjectMapper<mvc:annotation-driven />
P.S。我使用UserType将对象持久化到PostgreSQL和JPA / Hibernate4以获得JodaTime支持。 D.S。
更新
下面的配置解决了java.util.Date的问题,但JodaTime仍然没有骰子。
<annotation-driven>
<message-converters>
<beans:bean
class="org.springframework.http.converter.StringHttpMessageConverter" />
<beans:bean
class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<beans:bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<beans:property name="objectMapper">
<beans:bean
class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ">
</beans:bean>
</beans:property>
</beans:bean>
</message-converters>
</annotation-driven>
答案 0 :(得分:12)
或者,如果您更喜欢在Java中进行配置,它可能如下所示:
@Configuration
@EnableWebMvc
public 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());
}
}
答案 1 :(得分:11)
我最终使用jackson-datatype-joda:
开始工作添加另一个Maven依赖项(匹配您的Jackson版本号):
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>${jackson.version}</version>
</dependency>
然后将JodaModule(处理转换)注册到Jackson的ObjectMapper(这里是在Spring完成的,但你可以创建一个帮助类):
<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>
(您需要为ObjectMapper提供一个id,以便以这种方式引用它。)
Hibernate模块也以这种方式注册:https://github.com/FasterXML/jackson-module-hibernate
请注意,您需要设置问题中显示的(简单)DateFormat,但禁用SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS
似乎没有任何区别。
答案 2 :(得分:11)
总结答案并在Spring中发布JodaTime序列化的工作解决方案(在Spring 3.2上测试)
弹簧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依赖项(com.fasterxml.jackson-version为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>
在此之后,ResponseBody中的JodaTime字段将自动以JSON序列化为 “createdDate”:“2013-01-18T15:15:36.365 + 02:00”
答案 3 :(得分:2)
与joda DayTime的实体领域杰克逊创造的完全相同的b @#$ d一直在努力:
modifiedOn": {
"year": 2013,
"dayOfWeek": 6,
"era": 1,
"dayOfYear": 124,
"dayOfMonth": 4,
"weekOfWeekyear": 18,
"monthOfYear": 5,
"yearOfCentury": 13,
"centuryOfEra": 20,
"millisOfSecond": 0,
"millisOfDay": 81801000,
"secondOfMinute": 21,
"secondOfDay": 81801,
"minuteOfHour": 43,
"minuteOfDay": 1363,
"weekyear": 2013,
"yearOfEra": 2013,
"hourOfDay": 22,
"millis": 1367700201000,
"zone": {
"uncachedZone": {
"cachable": true,
"fixed": false,
"id": "Europe/Belgrade"
},
"fixed": false,
"id": "Europe/Belgrade"
},
"chronology": {
"zone": {
"uncachedZone": {
"cachable": true,
"fixed": false,
"id": "Europe/Belgrade"
},
"fixed": false,
"id": "Europe/Belgrade"
}
},
"afterNow": false,
"beforeNow": true,
"equalNow": false
}
正如这里提到的 https://github.com/FasterXML/jackson-datatype-joda 使用Jackson 2.0非常容易,但对于像我这样的新手来说很难弄清楚如何使它工作,但最终找到了一段代码:
maven中的依赖 - 这很简单
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.1.2</version>
</dependency>
以及FasterXML文档中的一些代码
objectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
......但是如何实施呢?以下是示例 - 新类:
public class JodaObjectMapper extends ObjectMapper {
public JodaObjectMapper() {
super();
registerModule(new JodaModule());
}
}
最后一步 - 添加到spring.xml
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="net.jvw.JodaObjectMapper"/>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
现在让我们看看生产的json
"modifiedOn": 1367701129075
最终很容易处理
来自博客文章http://vanwilgenburg.wordpress.com/2013/01/14/return-usable-joda-dates-in-json-with-jackson/
如果有人想查看我的实体类或控制器的更多代码 - 请在评论中提问,我会在此答案中添加足够的代码。
答案 4 :(得分:0)
我一直在努力解决同样的问题,并尝试在app-servlet.xml
中以这种方式将DateTime的Spring序列化简化为JSON:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean"/>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
您可以在此处找到no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean资料库中的java-json-client