使用@DateTimeFormat注解的时候报错

使用@DateTimeFormat注解的时候报错使用 Springboot 框架搭建项目 DateTimeForm 作用是前后到后台的时间格式的转换 使用 yyyy MM dd 格式的字符串传入日期类型数据是入参转换没有问题 使用 yyyy MM ddHH mm ss 格式时间字符串就会报错 Datapubliccl privateDatei 报错信息 messag

使用Springboot框架搭建项目

@DateTimeFormat作用是前后到后台的时间格式的转换,使用”yyyy-MM-dd”格式的字符串传入日期类型数据是入参转换没有问题,使用”yyyy-MM-dd HH:mm:ss”格式时间字符串就会报错

@Data public class DemoVO { private Date inputTime; }

 

报错信息:

“message”: “Could not read document: Can not deserialize value of type java.util.Date from String \”2016-03-03 12:12:12\”: not a valid representation (error: Failed to parse Date value ‘2016-03-03 12:12:12’: Can not parse date \”2016-03-03 12:12:12Z\”: while it seems to fit format ‘yyyy-MM-dd’T’HH:mm:ss.SSS’Z”, parsing fails (leniency? null))\n at [Source: java.io.PushbackInputStream@541af790; line: 3, column: 14] (through reference chain: com.icbc.patrol.entity.vo.DemoVO[\”inputTime\”]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String \”2016-03-03 12:12:12\”: not a valid representation (error: Failed to parse Date value ‘2016-03-03 12:12:12’: Can not parse date \”2016-03-03 12:12:12Z\”: while it seems to fit format ‘yyyy-MM-dd’T’HH:mm:ss.SSS’Z”, parsing fails (leniency? null))\n at [Source: java.io.PushbackInputStream@541af790; line: 3, column: 14] (through reference chain: com.icbc.patrol.entity.vo.DemoVO[\”inputTime\”])”,

原因是springboot默认采用jackson,而jackson只能识别以下几种日期格式

"yyyy-MM-dd'T'HH:mm:ss.SSSZ"; "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; "yyyy-MM-dd"; "EEE, dd MMM yyyy HH:mm:ss zzz"; long类型的时间戳(毫秒时间戳)

解决办法有以下几种:

1.、采用long时间戳,如:00 

2、在传参的对象上加上@JsonFormat注解并且指定时区

@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")

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

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

3、采用全局处理方式统一处理,推荐这个做法,重写springboot默认转换

参考https://blog.csdn.net//article/details/

public class MyDateFormat extends DateFormat { private DateFormat dateFormat; private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); public MyDateFormat(DateFormat dateFormat) { this.dateFormat = dateFormat; } @Override public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { return dateFormat.format(date, toAppendTo, fieldPosition); } @Override public Date parse(String source, ParsePosition pos) { Date date = null; try { date = format1.parse(source, pos); } catch (Exception e) { date = dateFormat.parse(source, pos); } return date; } // 主要还是装饰这个方法 @Override public Date parse(String source) throws ParseException { Date date = null; try { // 先按我的规则来 date = format1.parse(source); } catch (Exception e) { // 不行,那就按原先的规则吧 date = dateFormat.parse(source); } return date; } // 这里装饰clone方法的原因是因为clone方法在jackson中也有用到 @Override public Object clone() { Object format = dateFormat.clone(); return new MyDateFormat((DateFormat) format); } }
@Configuration public class WebConfig { @Autowired private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder; @Bean public MappingJackson2HttpMessageConverter MappingJsonpHttpMessageConverter() { ObjectMapper mapper = jackson2ObjectMapperBuilder.build(); // ObjectMapper为了保障线程安全性,里面的配置类都是一个不可变的对象 // 所以这里的setDateFormat的内部原理其实是创建了一个新的配置类 DateFormat dateFormat = mapper.getDateFormat(); mapper.setDateFormat(new MyDateFormat(dateFormat)); MappingJackson2HttpMessageConverter mappingJsonpHttpMessageConverter = new MappingJackson2HttpMessageConverter( mapper); return mappingJsonpHttpMessageConverter; } }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232106.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 运维必须掌握的27道Linux面试题

    运维必须掌握的27道Linux面试题1.解释下什么是GPL,GNU,自由软件?GPL:(通用公共许可证):一种授权,任何人有权取得、修改、重新发布自由软件的权力。GNU:(革奴计划):目标是创建一套完全自由、开放的的操作系统。自由软件:是一种可以不受限制地自由使用、复制、研究、修改和分发的软件。主要许可证有GPL和BSD许可证两种。 2.如何选择Linux操作系统版本?一般来讲,桌面用

    2022年5月13日
    69
  • 从智能家居的发展看对讲企业的定位

    从智能家居的发展看对讲企业的定位当你在浏览最近的热词榜单时,智能家居会位居其中。自智慧城市建设的大潮来袭之后,智能家居是“首当其冲”,自然是占了个大便宜!同时,楼宇对讲企业也迎来了春天。相信好多人都知道楼宇对讲,它最早是出现在高层住宅、公寓大厦内外,用来传递户内与单元门之间的信息,并控制防盗门,甚至可在紧急情况下住户通过它向安保值班室报警。它是智能家居体系下最重要的一部分。如今面对智…

    2022年6月22日
    26
  • python json转对象

    python json转对象json转对象是python比较常见的一个应用场景,如何来实现呢?这里会涉及json模块中的loads方法,具体操作如下:导入json包importjson自定义classclassResult:def__init__(self,token,userName,empCode):self.token=tokenself.userName=userNameself.empCode=empCode添加需转换j

    2025年7月16日
    3
  • Spring Boot 2.x 自定义数据源 DruidDataSource(操作 mysql 数据库)「建议收藏」

    Spring Boot 2.x 自定义数据源 DruidDataSource(操作 mysql 数据库)「建议收藏」目录DRUID简介配置参数自定义数据源Druid引入数据源切换Druid数据源配置Druid数据源参数配置Druid数据源监控配置Druid后台管理Servlet配置Druidweb监控filterDRUID简介1、Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了C3P0、DBCP、PROXOOL等DB…

    2022年6月10日
    178
  • py文件的运行

    安装过程及配置安装过程及配置安装过程及配置安装过程准备:下载好Python的安装程序后,开始安装,在进入安装界面后一定确保勾选将Python加入到系统环境变量的路径里。如图所示:2如果没有

    2022年3月29日
    78
  • 2021年最新PHP 面试、笔试题汇总(一)[通俗易懂]

    2021年最新PHP 面试、笔试题汇总(一)

    2022年2月18日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号