SpringBoot插入含LocalDate类型dateOfBirth字段数据时出现java.time.LocalDate报错如何解决
问题原因
- 核心原因是Java 8引入的
LocalDate属于JSR310日期时间类型,SpringBoot默认集成的Jackson序列化框架没有为该类型配置默认的字符串反序列化规则,无法直接将请求体中的字符串格式日期(如2024-05-20)自动转换为LocalDate类型对象,因此接口接收参数时会抛出反序列化失败异常。 - 次要可能原因:低版本SpringBoot没有内置Jackson对JSR310日期类型的支持依赖,或者请求传入的日期格式和预期格式不匹配。
解决方案
根据项目场景选择以下任意一种方案即可:
方案1:字段单独指定日期格式(适合个别字段有特殊格式需求的场景)
在UserSaveRequest类的dateOfBirth字段上添加注解,指定日期解析规则:
import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; @Getter @Setter public class UserSaveRequest { // 其他字段省略 @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDate dateOfBirth; }
方案2:全局配置统一日期格式(适合项目所有日期字段使用同一种格式的场景)
直接在SpringBoot配置文件中添加全局Jackson配置,无需单独给字段加注解:
application.yml配置
spring: jackson: date-format: yyyy-MM-dd time-zone: GMT+8 serialization: write-dates-as-timestamps: false
application.properties配置
spring.jackson.date-format=yyyy-MM-dd spring.jackson.time-zone=GMT+8 spring.jackson.serialization.write-dates-as-timestamps=false
方案3:手动注册JSR310序列化模块(适合低版本SpringBoot缺失对应依赖的场景)
首先引入Jackson对JSR310的支持依赖(高版本SpringBoot的spring-boot-starter-web已经自带,可跳过该步):
<!-- Maven依赖 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
然后添加Jackson配置类,注册日期序列化模块:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; 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 objectMapper = new ObjectMapper(); // 注册JSR310日期类型处理模块 objectMapper.registerModule(new JavaTimeModule()); // 关闭日期转时间戳的默认规则 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return objectMapper; } }
内容的提问来源于stack exchange,提问作者TamDV
相关产品推荐
相关产品推荐

