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

无法将LocalDate赋值给ReservationDto,Jackson序列化报错求助

解决Jackson序列化Java 8 LocalDate时的InvalidDefinitionException错误

问题背景

在给Reservation对象的LocalDate类型属性dateReservation赋值,同时填充ReservationDto对象时,日志能正常输出日期,但调用setDateReservation后触发Jackson序列化错误:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDate` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: fr.gopartner.locationvoiture.dto.ReservationDto["dateReservation"])

已添加Jackson相关依赖:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

使用JDK 11,尝试过更换依赖、配置Mapper对象,但问题依旧。

解决方案

1. 显式注册JSR310模块到ObjectMapper

Jackson不会自动加载JSR310模块,需要手动注册:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

// 初始化ObjectMapper时注册模块
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
// 可选:关闭时间戳序列化,改用ISO标准日期格式
objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

如果是Spring Boot项目,可通过配置类统一管理ObjectMapper:

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

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return mapper;
    }
}

2. 统一Jackson依赖版本

版本不一致会导致模块无法正常加载,在pom.xml中统一管理版本:

<properties>
    <jackson.version>2.15.2</jackson.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson.version}</version>
    </dependency>
</dependencies>

3. 确保Dto类属性有正确的访问方法

Jackson序列化需要通过getter方法访问属性,检查ReservationDto是否包含对应getter:

public class ReservationDto {
    private LocalDate dateReservation;

    // 必须存在getter方法
    public LocalDate getDateReservation() {
        return dateReservation;
    }

    public void setDateReservation(LocalDate dateReservation) {
        this.dateReservation = dateReservation;
    }
}

4. 排查多ObjectMapper实例问题

如果项目中存在多个ObjectMapper实例,需确保所有用于序列化/反序列化的实例都注册了JSR310模块,或直接使用Spring容器提供的统一ObjectMapper Bean。

验证方法

完成配置后,执行以下测试代码验证:

ReservationDto reservationDto = new ReservationDto();
reservationDto.setDateReservation(LocalDate.now());
ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
String json = mapper.writeValueAsString(reservationDto);
System.out.println(json);

若输出类似{"dateReservation":"2024-05-20"}的JSON格式内容,说明问题已解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:52:48