NA.*_*NA. 14 spring json spring-mvc jodatime jackson
我正在使用Spring MVC 3.2RC1中的REST API.
我正在获取一个带有org.joda.time.DateTime时间戳的JPA实体,并让Spring将其序列化为JSON
@RequestMapping(value = "/foobar", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
Run Code Online (Sandbox Code Playgroud)
使用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>
Run Code Online (Sandbox Code Playgroud)
到我的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}
Run Code Online (Sandbox Code Playgroud)
但我希望它和ISO8601日期如2007-11-16T20:14:06.3Z(或带偏移量).
我的猜测是我需要访问ObjectMapper并设置mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 但是如何在使用时访问ObjectMapper
<mvc:annotation-driven />
Run Code Online (Sandbox Code Playgroud)
PS我使用UserType将对象持久化到PostgreSQL和JPA/Hibernate4以获得JodaTime支持.DS
更新
下面的配置为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>
Run Code Online (Sandbox Code Playgroud)
小智 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());
}
}
Run Code Online (Sandbox Code Playgroud)
pau*_*lcm 11
我最终使用jackson-datatype-joda工作了:
添加另一个Maven依赖项(匹配您的Jackson版本号):
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>${jackson.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
然后将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>
Run Code Online (Sandbox Code Playgroud)
(您需要为ObjectMapper提供一个id,以便以这种方式引用它).
Hibernate模块也以这种方式注册:https://github.com/FasterXML/jackson-module-hibernate
请注意,您需要设置问题中显示的(简单)DateFormat,但禁用SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS
似乎没有任何区别.
小智 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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
在此之后,ResponseBody中的JodaTime字段将在JSON中自动序列化为"createdDate":"2013-01-18T15:15:36.365 + 02:00"
归档时间: |
|
查看次数: |
17473 次 |
最近记录: |