您的位置:首页 > 编程语言 > Java开发

SpringMVC RequestBody接收数据日期出现时差

2016-10-21 00:00 483 查看
在使用SpringMVC+Jackson json2的时候接收JSON数据的日间出现了时差,原因是因为在ObjectMapper中默认的时区是GMT。

protected final static BaseSettings DEFAULT_BASE = new BaseSettings(DEFAULT_INTROSPECTOR,
DEFAULT_ANNOTATION_INTROSPECTOR, STD_VISIBILITY_CHECKER, null, TypeFactory.defaultInstance(),
null, StdDateFormat.instance, null,
Locale.getDefault(),
//            TimeZone.getDefault()
TimeZone.getTimeZone("GMT"),
Base64Variants.getDefaultVariant() // 2.1
);

SpringMVC中使用RequestMappingHandlerAdapter中的messageConverters来保存转换器,来对不同的消息类型进行转换,这里要解决时区问题我们就需要添加自定义的转换器,或者对已有的转换器做设置,SpringMVC对JSON数据做转换使用的是MappingJackson2HttpMessageConverter类,在这个类中有一个ObjectMapper对象,我们只要重新设置这个对象就可以了。

1.继承ObjectMapper并设置默认时区

public class CustomerObjectMapper extends ObjectMapper
{
public CustomerObjectMapper()
{
this.setTimeZone(TimeZone.getDefault());
}
}

2.配置Spring的转换器

<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 将StringHttpMessageCOnverter的默认编码设为UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<!-- 添加一处JSON转换器 -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.isoftstone.cbems.common.json.CustomerObjectMapper"></bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

当项目启动后我们所加的转换器会在messageConverters最前面,SpringMVC会依次遍历这些转换器并判断选择对应的转换器

AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters

for (HttpMessageConverter<?> converter : this.messageConverters) {
if (converter instanceof GenericHttpMessageConverter) {
GenericHttpMessageConverter genericConverter = (GenericHttpMessageConverter) converter;
if (genericConverter.canRead(targetType, contextClass, contentType)) {
if (logger.isDebugEnabled()) {
logger.debug("Reading [" + targetType + "] as \"" +
contentType + "\" using [" + converter + "]");
}
return genericConverter.read(targetType, contextClass, inputMessage);
}
}
if (targetClass != null) {
if (converter.canRead(targetClass, contentType)) {
if (logger.isDebugEnabled()) {
logger.debug("Reading [" + targetClass.getName() + "] as \"" +
contentType + "\" using [" + converter + "]");
}
return ((HttpMessageConverter<T>) converter).read(targetClass, inputMessage);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SpringMVC