您现在的位置是:网站首页 > 代码编程 > JAVA开发JAVA开发

【原】springboot使用jackson处理时间碰到的两个坑

不忘初心 不忘初心 2019-04-10 围观() 评论() 点赞() JAVA开发

简介:之前使用springmvc的时候,没有太注意json转换的细节,而且也没出过什么大问题,换成springboot之后,自动化配置的东西太多,导致忽略了很多细节处

之前使用springmvc的时候,没有太注意json转换的细节,每次都是直接写了一个Databinder,也没出过什么大问题,换成springboot之后,自动化配置的东西太多,导致忽略了很多细节处理,最近就碰见了两个问题:

jackson转换时间有时区差,会导致时间晚8小时

在我本机上,我一直没有重现过,当时在服务器上出现过,导致入库的时间不准确,解决方案有很多,我选择了在配置文件中配置jackson的时区:

spring.jackson.time-zone=GMT+8

使用feign调用微服务的时候,提示日期format不对

项目微服务之间调用的时候,使用feign进行调用,被调用方使用@RequestBody以json格式接收数据

@PostMapping("/services/api/order/push")
public CommonRestResult push(@RequestBody @Valid OrderPushDTO orderPushDTO) {
    return RestBusinessTemplate.transaction(() -> orderManager.push(orderPushDTO));
}

可是调用方传输数据的时候,就报错了:

2019-04-03 17:04:41.605  WARN 1080 --- [nio-9030-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize value of type java.util.Date from String "2019-04-02 16:41:29": not a valid representation (error: Failed to parse Date value '2019-04-02 16:41:29': Can not parse date "2019-04-02 16:41:29": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS', parsing fails (leniency? null)); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String "2019-04-02 16:41:29": not a valid representation (error: Failed to parse Date value '2019-04-02 16:41:29': Can not parse date "2019-04-02 16:41:29": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS', parsing fails (leniency? null))
 at [Source: java.io.PushbackInputStream@556337e2; line: 1, column: 25] (through reference chain: com.digitalbertahan.loan.supermarket.biz.export.dto.OrderPushDTO["createTime"])
2019-04-03 17:04:41.668  WARN 1080 --- [nio-9030-exec-1] com.netflix.spectator.api.Spectator      : no config impl found in classpath, using default

因为jackson支持的时间格式只有这几种:

"yyyy-MM-dd'T'HH:mm:ss.SSSZ"  
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"  
"EEE, dd MMM yyyy HH:mm:ss zzz"  
"yyyy-MM-dd" 

类型倒是挺丰富的,但就是没有常用的yyyy-MM-dd HH:mm:ss格式。

解决方法也有很多,如果涉及到的字段不多,可以直接在字段上加上注解:@JsonFormat( pattern="yyyy-MM-dd HH:mm:ss"),如果日期字段很多,那就别一个个的加了,直接在配置中加上日期格式

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

如果是springboot工程,也可以直接在config类中配置:

@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
    return jacksonObjectMapperBuilder ->
            jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("GMT+8"));
}

springbootjacksonspringjson

看完文章,有任何疑问,请加入群聊一起交流!!!

很赞哦! ()

文章评论

  • 请先说点什么
    人参与,条评论

请使用电脑浏览器访问本页面,使用手机浏览器访问本页面会导致下载文件异常!!!

雨落无影

关注上方公众号,回复关键字【下载】获取下载码

用完即删,每次下载需重新获取下载码

若出现下载不了的情况,请及时联系站长进行解决

站点信息

  • 网站程序:spring + freemarker
  • 主题模板:《今夕何夕》
  • 文章统计:篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们