无法将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
相关产品推荐
相关产品推荐

