SpringBoot中jackson日期格式化问题(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS not turning off timestamps)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: SpringBoot中jackson日期格式化问题(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS not turning off timestamps)

最近在做一个Springboot项目,中间遇到一个问题就是日期的格式化,每次实体类中的字段为Date类型时,从前端传到后台的时间格式老出错,属性字段上也加上@DateJsonFormat@JsonFormat注解了,但还是不行,后台报错,,在MVC环境中显示正常,到了springboot中就由2019-03-06 06:14:32 变成了 2020-02-19T06:14:32.005+0000,经查是由于Jackson未在springboot环境中配置对应的日期格式导致。

一、异常信息

org.springframework.web.client.RestClientException: Error while extracting response for type
[class com.imooc.entity.Product] and content type [application/json;charset=UTF-8];
 nested exception is org.springframework.http.converter.HttpMessageNotReadableException:
 JSON parse error: Cannot deserialize value of type `java.util.Date` from String "2020-02-19 21:33:16":
 not a valid representation (error: Failed to parse Date value '2020-02-19 21:33:16':
 Cannot parse date "2020-02-19 21:33:16": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ',
 parsing fails (leniency? null)); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: 
Cannot deserialize value of type `java.util.Date` from String "2020-02-19 21:33:16": not a valid representation (error: Failed to parse Date value '2020-02-19 21:33:16': 
Cannot parse date "2020-02-19 21:33:16": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))
 at [Source: (PushbackInputStream); line: 1, column: 141] (through reference chain: com.imooc.entity.Product["createAt"])
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:115)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:689)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:644)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:399)
    at com.imooc.util.RestUtil.postJSON(RestUtil.java:31)
    at com.imooc.controller.ProductControllerTest.lambda$0(ProductControllerTest.java:59)
    at java.util.ArrayList.forEach(Unknown Source)

二、异常原因

主要问题就是实体类的Date转化Json过程出现错误。

2.1、Springboot默认使用的json解析框架是jackson框架

2.2、jackson解析框架在解析实体类里面是Date数据类型的数据时的默认格式是:UTC类型,即yyyy-MM-dd’T’HH:mm:ss.SSS 并且默认为+8时区,即时间基础上加8小时

请求数据格式为: 'yyyy-MM-dd HH:mm:ss',但是在接收到数据的时候,需要通过jackson把数据转化成Dto对象。jackson转化的时候,默认的时间格式是 'yyyy-MM-dd'T'HH:mm:ss.SSS’,所以就会出现上面的异常。

三、解决方案

方案一:将spring的jackson日期格式写在配置文件中即可

spring:

 jackson:

   date-format: yyyy-MM-dd HH:mm:ss

   time-zone: GMT+8

   serialization:

     write-dates-as-timestamps: false

spring:
  application:
    name: operation-service
    system: wisdomhome
  main:
    allow-bean-definition-overriding: true    
  profiles:
    active: local
  servlet:
    multipart:
      max-file-size: 1024MB
      max-request-size: 1024MB
  cloud:
    zookeeper:
      discovery:
        enabled: true
        register: true
        root: /immoc-service
      connectString: dev.soft.com:53200
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    serialization:
      write-dates-as-timestamps: false

或者写成以下格式(主要取决于配置文件是yml, properties等什么格式的):

#日期格式化

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

spring.jackson.time-zone=GMT+8

spring.jackson.serialization.write-dates-as-timestamps=false

方案二:在实体Date类型的字段上使用@JsonFormat注解格式化日期(这个方法有时候可以,有时候不行)

此方案要注意 timezone 值的写法,不要在 “+”号两边留空格,如果加号两边有空格会导致解析失败的哦~~~

    /**
     * 创建时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT + 8")
    private Date createTime;

方案三:通过下面方式取消timestamps形式

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

其他方案:

如果项目中使用json解析框架为fastjson框架,则可使用如下解决方法:在实体字段上使用@JsonFormat注解格式化日期

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")

 

 

完结!


相关文章
|
JSON Java 开发工具
jackson学习之九:springboot整合(配置文件)
熟悉和实践在springboot应用中通过application.yml对jackson进行全局设置
134 4
jackson学习之九:springboot整合(配置文件)
|
6月前
|
Java
springboot解决jackson序列化Long类型精度失效问题
springboot解决jackson序列化Long类型精度失效问题
152 0
|
7月前
|
JSON fastjson Java
Spring Boot Jackson 和Fast JSON 用哪个好啊 ?
【4月更文挑战第22天】
1242 1
|
7月前
|
JSON 前端开发 Java
【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之Spring定义Jackson转换Null的方法和实现案例
【SpringBoot实战专题】「开发实战系列」全方位攻克你的技术盲区之Spring定义Jackson转换Null的方法和实现案例
139 0
|
Java
springboot中jackson的yml配置
springboot中jackson的yml配置
239 0
|
Java 网络安全 API
jackson学习之十(终篇):springboot整合(配置类)
在springboot应用中,编码实现Jackson工具类的实例化和配置
189 0
jackson学习之十(终篇):springboot整合(配置类)
|
JSON Java API
Spring Boot之Jackson快速入门,你必须得会!
在上一期《SpringBoot之Jackson配置全局时间日期格式》文中提到Jackson,了解到有很多小伙伴对它很感兴趣;顾这一期,我就重点带着大家以最基础的教学方式领大家入门,废话不多说,咱们这就开始。
|
JSON Java fastjson
SpringBoot-24-默认Json框架jackson详解
SpringBoot-24-默认Json框架jackson详解
453 0
|
JSON Java 数据格式
SpringBoot Jackson Date类型格式设置
SpringBoot Jackson Date类型格式设置 一、背景说明 在使用SpringBoot+SpringMVC时,默认采用Jackson包来进行JSON转换。 在返回Date类型的数据时,Jackson会以时间戳的形式返回,而实际场景往往需要以yyyy-MM-dd HH:mm:ss这类日期或时间格式返回。
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
191 1