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

Spring Boot中JSON解析LocalDateTime类型出现实例化异常求助

问题原因及解决办法

问题根源

把createdAt字段从String改为LocalDateTime后报错,核心原因是JSON序列化/反序列化框架(默认是Jackson)不支持Java 8日期类型与字符串的自动转换,Mock数据加载或Repository初始化时,无法将JSON中的日期字符串实例化为LocalDateTime对象,导致构造函数执行失败。

解决步骤

1. 添加Jackson Java 8日期模块依赖

Jackson默认没有内置Java 8日期类型的处理模块,需要手动引入:

  • Maven(pom.xml):
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
  • Gradle(build.gradle):
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'

2. 配置日期字段的序列化/反序列化

有两种方式可选:

方式一:字段级注解配置

直接在createdAt字段上添加@JsonFormat注解,指定与JSON格式匹配的日期模式:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Video {
    private Integer id;
    private String title;
    private String duration;
    private String description;
    private String url;
    // 匹配JSON中的纳秒级日期格式
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS")
    private LocalDateTime createdAt;
    private Integer creatorId;
    private String category;
    private Integer view;
    private Integer like;
    private Integer dislike;
}

方式二:全局Jackson配置

创建配置类,让所有Java 8日期类型都能自动处理,无需每个字段加注解:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 注册Java 8日期模块
        objectMapper.registerModule(new JavaTimeModule());
        // 禁用将日期序列化为时间戳的默认行为,保留字符串格式
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return objectMapper;
    }
}

3. 验证Mock数据加载逻辑

如果你的Mock数据是通过手动读取JSON并转换为Video对象,确保使用的ObjectMapper已经注册了JavaTimeModule,避免转换失败。

额外注意点

  • JSON中的createdAt包含9位纳秒(.973058478),所以日期模式必须写SSSSSSSSS,否则会出现格式不匹配的错误。
  • 如果使用@Builder生成实例,Lombok会自动适配LocalDateTime类型参数,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:42:50