ObjectMapper转换Date异常

8 篇文章 0 订阅

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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值