Feign接口JSON数据转Date类型数据慢8小时问题

今天记一次错误排查及解决笔记

现象

最近在接口联调中发现一个现象,前端传入JSON格式数据,其中包含Long型时间戳,但是在调用Feign接口(有Date类型参数)的时候,发现Date类型参数总是比正确时间慢8小时

比如{"time":1515147840000},正确的Date类型时间应该是“2018-01-05 18:24:00”,但是经过Feign内部Encoder转换后的Date却是“2018-01-05 10:24:00”,比正确时间慢8小时

分析

我们处在东八区,看到8小时,直觉是转换时时区设置错误的问题。Feign中数据的编/解码使用的是SpringEncoder和SpringDecoder,查看源码

SpringEncoder

具体负责转换工作的是HttpMessageConverters,经过Debug,发现JSON数据默认使用的转换器是MappingJackson2HttpMessageConverter

熟悉Jackson的朋友应该知道,转换工作实际上是通过ObjectMapper来进行的,下面来说坑:如果不做设置,ObjectMapper中默认的TimeZone是UTC,会比我们东八区慢8小时,这就是原因所在

ObjectMapper

方案

(1)我们可以在@JsonFormat注解上通过设置timezone来处理,但是如果你有大量的接口,每个都这样处理显然不是一个好办法

(2)怎样全局处理?

首先需要自定义ObjectMapper,并设置时区(可通过Spring创建Bean的方式,请依据实际场景自行决定)

之后把上一步创建的ObjectMapper设置到MappingJackson2HttpMessageConverter中

看似Feign的问题,根源在于Jackson,使用Jackson时要注意这点

Done

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,218评论 6 13
  • 在iOS开发中,经常会遇到各种各样的时间问题,8小时时差,时间戳,求时间间隔,农历等等。解决办法网上比比皆是,但大...
    真巧了_嘿阅读 2,825评论 0 7
  • iOS开发中,经常会遇到各种各样的时间问题,8小时时差,时间戳,求时间间隔,农历等等。解决办法网上比比皆是,但大多...
    小李龍彪阅读 6,456评论 1 6
  • 简单来说, 完全二叉树是指按照层次进行遍历的时候所得到的序列与满二叉树相对应 这里提供两种思路和相应的代码: 1....
    爱上落入尘世间的你阅读 1,133评论 0 0