SpringBoot 日期转换错误JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime`

本文介绍了在SpringBoot中处理LocalDate和LocalDateTime类型的日期格式化问题,特别是在Swagger上测试时的注意事项。当日期是LocalDate类型时,Jackson自动处理;而对于LocalDateTime,需要自定义配置。解决方案包括创建LocalDateTimeGlobalConfig配置类,设置日期时间格式,并提供了使用转换器的备选方案。同时,展示了使用@DateTimeFormat注解处理GET请求参数的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、java 中 LocalDate 类型的数据在 swagger 上进行测试时,以json 格式输入时格式为2018-07-09,需要特别注意的是,07和09是两位数字,不是一位数字。

2、如果日期是 LocalDate 类型,那么不论是前台传String格式日期给后台,还是后台返回格式化传给前端的日期,JacksonAutoConfiguration会自动处理。

3、如果日期是LocalDateTime类型,那么前端到后端、后端返回给前端均需要我们进行处理。因为下面yml中的配置不适用于Java 8日期类型,例如LocalDate和LocalDateTime,它只使用于Date或DateTime类型的字段。

#日期格式化
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss

 解决方案:增加LocalDateTimeConfig配置类

/**
 * LocalDateTime全局格式
 */
@Configuration
public class LocalDateTimeGlobalConfig {
    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 配置LocalDateTime类型序列化与反序列化
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        /*return new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
                jacksonObjectMapperBuilder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
                jacksonObjectMapperBuilder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
            }
        };*/
        //这种方式等同于上边
        return builder -> {
            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
            builder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
        };
    }
}

【注】

1、也可以用转换器来解决该问题。

     参考文章:SpringBoot中对LocalDateTime进行格式化并解析_流烟默的博客-CSDN博客_localdatetime格式化 yyyymmdd注解

SpringBoot 日期转换错误JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime`_Jack魏的博客-CSDN博客

2、 Date和LocalDateTime均可以使用的解决方案(我认为这种用处不大),参考文章:

SpringBoot做全局的日期格式化LocalDateTime_梁可爱的博客-CSDN博客

SpringBoot中对LocalDateTime进行格式化并解析_流烟默的博客-CSDN博客_localdatetime格式化 yyyymmdd注解

3、get请求获取LocalDateTime的方式与Date一样,都是使用注解:

@GetMapping("date")
public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date) {
    return date;
}

@GetMapping("date2")
public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
    return date;
}

4、 解决的原理关键在于JacksonAutoConfiguration类,

 原理分析可以参考以下文章:

Spring Boot2自动化配置及使用jackson进行json解析_洛阳桥边的博客-CSDN博客

https://www.jianshu.com/p/560e9b114c29

LocalDateTime格式化处理及全局配置_擦肩而过的博客-CSDN博客_localdatetime 格式化

在Spring Boot中格式化JSON日期_盲目的拾荒者的博客-CSDN博客

【汣袆 - Java】SpringBoot接收Date类型参数;SpringBoot接收时间类型参数;后端接收Date类型参数;后端接收时间类型参数;后台接收date类型参数; - 你好,Alf - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值