当前位置:   article > 正文

关于Cannot deserialize value of type `java.time.LocalDateTime` from String “1921-7-23“异常

cannot deserialize value of type `java.time.localdatetime`

目录

一、问题:

二、问题根源:

2.1小知识点

2.2问题复现

三、解决方案:

3.1实体类用LocalDate类型来接收请求体中的日期数据。

3.2若前端是在form表单中传递的日期数据

三、经验教训:

一、问题:

废话少说:接收前端传来的时间参数的时候出现了时间反序列化异常。

二、问题根源:

前后端时间格式不一致,前端的时间格式只有日期信息,没有时间信息,而后端用了LocalDateTime类型。

2.1小知识点

  • LocalDateTime类型不但包含了日期信息,而且还包含了时间信息。通常用来保存 "1921-7-23 10:20:59" 这种格式的数据。
  • LocalDate类型只包含日期信息。通常用来保存 "1921-7-23" 这种格式的数据。
  • Date类型也是包含了日期和时间信息,但是这种类型比较古老,在设计上存在一定缺陷,不推荐使用。

2.2问题复现

用postman模拟,前端传过来的数据格式是:

实体类:

  1. @Data
  2. public class BodyJsonTimeDto {
  3. private LocalDateTime time1;
  4. private LocalDateTime time2;
  5. private LocalDateTime time3;
  6. }

controller层:

  1. @RestController
  2. @RequestMapping("/time")
  3. public class TimeController {
  4. //接收请求体中json格式的时间
  5. @PostMapping("/bodyJsonTime")
  6. public BodyJsonTimeDto getBodyJsonTime(@RequestBody BodyJsonTimeDto time) {
  7. return time;
  8. }
  9. }

异常:反序列化时间失败

三、解决方案:

3.1实体类用LocalDate类型来接收请求体中的日期数据。

  1. @Data
  2. public class BodyJsonTimeDto {
  3. private LocalDate time1;
  4. private LocalDate time2;
  5. private LocalDate time3;
  6. }

3.2若前端是在form表单中传递的日期数据

前端传参:

后端实体类接收:

  1. @Data
  2. public class BodyFormTimeDto {
  3. @DateTimeFormat(pattern = "yyyy-MM-dd")//格式化前端的日期数据
  4. private LocalDate time4;
  5. @DateTimeFormat(pattern = "yyyy-MM-dd")//格式化前端的日期数据
  6. private LocalDate time5;
  7. }

后端controller

方式一:

  1. @RestController
  2. @RequestMapping("/time")
  3. public class TimeController {
  4. //接收请求体中form表单格式的时间,实体类收参
  5. @PostMapping("/bodyFormTime")
  6. public BodyFormTimeDto getBodyFormTime(BodyFormTimeDto time){ //注意这里不加@RequestBody注解,这里接收的是form表单数据
  7. return time;
  8. }
  9. }

方式二:

  1. @RestController
  2. @RequestMapping("/time")
  3. public class TimeController {
  4. //接收请求体中form表单格式的时间,零散收参
  5. @PostMapping("/bodyFormTime")
  6. public void getBodyFormTime(@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate time4,
  7. @DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate time5){
  8. System.out.println("time4 = " + time4);
  9. System.out.println("time5 = " + time5);
  10. }
  11. }

三、经验教训:

一定要与前端约定好日期时间数据的格式。

"1949-10-01"只包含日期信息,后端用LocalDate类型接收

"1949-10-01 10:20:37"包含了日期和时间信息,后端用LocalDateTime类型接收

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

闽ICP备14008679号