You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC DateTimeFormat异常:LocalDate无法反序列化问题求助

解决Spring接收LocalDate类型JSON参数的序列化问题

这个问题我做Spring项目时也踩过坑!核心原因是Jackson默认不支持Java 8引入的java.time.LocalDate这类新时间API的序列化/反序列化——因为LocalDate没有无参构造函数,Jackson不知道该怎么把你POST的日期字符串转成对应的Java对象。

下面给你几个实用的解决办法,按推荐程度排序:

1. 引入Jackson的Java 8时间模块(最推荐)

这是最通用的方案,一次配置全项目生效。你需要在项目依赖里加入Jackson专门处理Java 8时间类型的模块:

Maven项目

在pom.xml里添加依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <!-- Spring Boot项目无需指定版本,父依赖已统一管理 -->
</dependency>

Gradle项目

在build.gradle里添加:

implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'

添加依赖后,Spring会自动识别并注册这个模块,之后就能正常解析LocalDate类型的参数了。

2. 手动配置ObjectMapper(适合自定义需求)

如果需要更个性化的配置,比如强制指定日期格式,可以手动创建ObjectMapper并注册JavaTimeModule:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 注册Java 8时间模块
        mapper.registerModule(new JavaTimeModule());
        // 可选:关闭日期转时间戳的默认行为,保留字符串格式
        mapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return mapper;
    }
}

3. 在实体类字段上添加注解(局部解决)

如果只需要处理某个实体类的LocalDate字段,可以直接在字段上添加Jackson的序列化/反序列化注解:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import java.time.LocalDate;

public class Booking {
    private Long id;
    
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate checkin;
    
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate checkout;
    
    // 构造函数、getter、setter省略
}

这样配置后,POSTMAN提交的"2017-03-01"格式的字符串就能被正确转成LocalDate对象了。

内容的提问来源于stack exchange,提问作者kurt estacion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:47