当前位置:   article > 正文

【springboot】实体类承载数据库datetime字段遇到的问题及解决方案_mysql datetime illegalargumentexception

mysql datetime illegalargumentexception

前言:本文主要用于我的个人学习与记录,内容如有谬误欢迎各位大佬斧正。同时,如果您想要快速获取问题的解决方案,请移步至文章底部“解决方案”栏,希望我的经验能对大家有所帮助。


问题描述

如题,由于项目需求中涉及到数据更新时间的记录,于是我在Mysql中设计了一个datetime类型的字段用于存放该时间,数据库内容如下:

本来最开始我们是相安无事的,但当我在entity层用hutool工具类提供的日期时间对象Datetime承载从数据库获取到的datetime数据时,控制台报错:

2022-08-09 15:04:04.469 ERROR 60464 --- [nio-9090-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'time' of 'class com.ruocheng.springboot.entity.Housing' with value 'Tue Aug 09 16:21:51 CST 2022' Cause: java.lang.IllegalArgumentException: argument type mismatch] with root cause

同时前端表格内容显示为:


原因及思路

观察控制台报错内容,基本可以确定是Hutool提供的Datetime对象和Mysql的datetime类型不匹配造成的问题,但我查了好久的资料也没找到不匹配的根本原因,如果有知道的小伙伴可以评论或者私信告诉我。言归正传,于是我尝试用java.sql里的Date对象承载此数据,这次没有报错,前端表格内容也可以正常显示,但日期格式丢失了分秒时:

在这里我犯的是一个低级错误: java.sql的Date对象仅精确到yyyy-MM-dd也就是年月日,用它来承载datetime类型的数据会丢失后面的时分秒根本不足为奇,这时如果用 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解强行保持时间格式一致性,也只会显示00:00:00。

于是我又在大佬的建议下尝试用java.sql里的Timestamp对象承载该数据,成功在前端表格正确显示内容:

在这里有一个值得注意的点——在用各种方式保持时间格式一致性时,需要注意时区问题(系统默认的是GMT格林威治时间,而数据库储存的是GMT+8北京时间),如果不注意时区配置的话会出现显示时间与实际时间相差8小时的情况。此处我选择的是@JsonFormat注解,代码如下:

  1. @Data
  2. public class Housing {
  3. private String type;
  4. private String distract;
  5. private String table;
  6. private String sql;
  7. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  8. private Timestamp time;
  9. }

 后来经过我的搜索,发现可以使用java.time里面的LocalDateTime对象,该对象能够匹配Mysql的datetime类型,并且由于LocalDateTime与datetime一样是表示的没有时区的日期时间,可以在保持时间格式一致性时无需注意时区配置。最终显示结果与上图一样,我就不额外贴图了。


解决方案

综上,该问题我总结出了两种解决方案:

  1. 使用java.sql.Timestamp对象承载datetime类型数据,需要注意时区转换
  2. 使用java.time.LocalDateTime对象承载datetime类型数据,无需注意时区

代码如下:

  1. import java.sql.Timestamp;
  2. @Data
  3. public class Housing {
  4. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
  5. private Timestamp time;
  6. }

或者:

  1. import java.time.LocalDateTime;
  2. @Data
  3. public class Housing {
  4. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  5. private Timestamp time;
  6. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/253760
推荐阅读
相关标签
  

闽ICP备14008679号