ObjectMapper转换Date异常
问题
远程调用服务的时候,拿到返回数据,这时候如果直接强转成Object,会报错,这时候需要借助ObjectMapper来转换,以下:
TableDataInfo dataInfo = result.getData();
List<YourObjectDTO> list =
new ObjectMapper().convertValue(dataInfo.getRows(), new TypeReference<List<YourObjectDTO>>() {
});
本来这段代码相安无事的运行了好久,知道有一天快下班的时候发现某个操作时间显示的是在未来发生的,然后有趣的夜生活就此拉开序幕…
首先排除了服务器和mysql数据库时间是没有问题的,数据也是没有问题的,首先想到的是后端传给前端使用Jackson转换时间会有时区问题(差8个小时),对比数据发现刚好是一致的,于是在application.yml中加上以下配置:
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
加完之后问题依然存在,忍不住开终极大招,重启大法,问题依然存在…
一顿百度无果遂放弃,开始debug,看看源码,一顿埋头苦找…
protected final static BaseSettings DEFAULT_BASE = new BaseSettings(
null, // cannot share global ClassIntrospector any more (2.5+)
DEFAULT_ANNOTATION_INTROSPECTOR,
null, TypeFactory.defaultInstance(),
null, StdDateFormat.instance, null,
Locale.getDefault(),
null, // to indicate "use Jackson default TimeZone" (UTC since Jackson 2.7)
Base64Variants.getDefaultVariant(),
// Only for 2.x; 3.x will use more restrictive default
LaissezFaireSubTypeValidator.instance
);
当看到to indicate “use Jackson default TimeZone” 这句话时,发现果然还是时区问题导致的…
解决方案
发现问题就好办了,接下来只需要改掉默认时区就行了,以下:
ObjectMapper mapper = new ObjectMapper()
.enable(SerializationFeature.INDENT_OUTPUT)
.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
.registerModule(new JodaModule())
.setTimeZone(TimeZone.getTimeZone("GMT+8"));
List<YourObjectDTO> list =
mapper.convertValue(dataInfo.getRows(), new TypeReference<List<YourObjectDTO>>() {});
至此,问题解决。
最后,附上pom引用:
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.3.0-rc1</version>
</dependency>