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

文章讲述了在Java项目中,由于前端和后端时间格式不一致导致的时间序列化异常。解决方案包括使用LocalDate和LocalDateTime正确处理日期和时间数据,并强调了约定统一日期时间格式的重要性。
摘要由CSDN通过智能技术生成

目录

一、问题:

二、问题根源:

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模拟,前端传过来的数据格式是:

实体类:

@Data
public class BodyJsonTimeDto {
    private LocalDateTime time1;
    private LocalDateTime time2;
    private LocalDateTime time3;
}

controller层:

@RestController
@RequestMapping("/time")
public class TimeController {
    //接收请求体中json格式的时间
    @PostMapping("/bodyJsonTime")
    public BodyJsonTimeDto getBodyJsonTime(@RequestBody BodyJsonTimeDto time) {
        return time;
    }
}

异常:反序列化时间失败

三、解决方案:

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

@Data
public class BodyJsonTimeDto {
    private LocalDate time1;
    private LocalDate time2;
    private LocalDate time3;
}

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

前端传参:

后端实体类接收:

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

后端controller

方式一:

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

方式二:

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

三、经验教训:

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

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

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

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值