使用@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)
上一篇 2025年11月1日 下午2:01
下一篇 2025年11月1日 下午2:22


相关推荐

  • Java并发:整理自《Java并发编程实战》和《Java并发编程的艺术》

    Java并发:整理自《Java并发编程实战》和《Java并发编程的艺术》声明 Java 并发的内容是自己阅读 Java 并发编程实战 和 Java 并发编程的艺术 整理来的 图文并茂请戳思维导图下载请戳目录 1 基础概念 2 线程 3 锁 4 同步器 5 并发容器和框架 6 Java 并发工具类 7 原子操作类 8 Executor 框架 执行机制 9 其他 一 基础概念 1 可见性和原子性可见性 一个线程

    2026年3月17日
    2
  • 【Android】Broadcasts详解

    【Android】Broadcasts详解Android应用程序可以发送广播,也可以接收Android系统或者其它应用发出的广播,这跟发布-订阅设计模式很相似。当一些受到关心的事件发生后,广播会被自动发送。举例来说,当一些系统事件(如开机,设备开始充电等)发生,Android系统会发送广播。应用程序也可以发送自定义的广播,比如当某个应用关注的事件(如数据更新等)发生后可以发送广播提醒它。系统广播当一系列系统事件发生的时候,系统会自动发送广播

    2022年6月15日
    28
  • eclipse导入web项目jsp报错

    eclipse导入web项目jsp报错老师给了个使用 SSM 框架开发公寓管理系统的项目 在使用 eclipse 导入项目的时候 发现 jsp 文件报错 解决后写个博客记录一下 第一种方式 此时我们就是需要在这个项目中去导入对应的 tomcat 打开项目右击项目选择 BuildPath 点击 configureBui 在 propertiesfo 项目名选择 Libraries 直接点击 addLibrary 之后直接添加相对应的 tomcat 就好了 记住别忘了点击 apply 第二种方式 如果你能确定项目没问题 你可以把

    2026年3月16日
    2
  • 周末、ConcurrentHashMap、一个Bug

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!真正的努力,从来都不是埋头苦干,还要时不时的偷偷懒周末周末了,有一段时间没用周末加班了。今天下午在家了加了会班,写了一会代码,因为下周要请一天假,而我手头的工作还有一些没有搞定,只能抽点时间赶赶进度。我所在的城市今天下着小雨,天气变得冷了起来。坐在电脑前,开着暖风机,不至于让敲代码的冻着(…

    2022年2月28日
    52
  • C、C++基础知识之 六 CString::ReverseFind()和CString::Find()区别「建议收藏」

    C、C++基础知识之 六 CString::ReverseFind()和CString::Find()区别「建议收藏」CString::ReverseFindintReverseFind(TCHARch)const;返回值:参数:    ch要搜索的字符。说明:此成员函数在此CString对象中搜索与一个子串匹配的最后一个字符。此函数类似于运行时函数strrchr。“最后一个字符”是指从左往右的最后一

    2022年6月23日
    33
  • JWT原理详解_电磁感应现象原理

    JWT原理详解_电磁感应现象原理1.COOKIE使用和优缺点1.1cookie原理:用户名+密码cookie是保存在用户浏览器端,用户名和密码等明文信息1.2session使用原理session是存储在服务器端的一段字符串,相当于字典的key1.用户向服务器发送用户名和密码。2.验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中。3.服务器向用户返回session_id,session信息都会写入到用户的Cookie。4.用户的每个后续请求都将通过在Cookie中取出session_id传给

    2022年4月19日
    50

发表回复

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

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