解决报错InvalidDefinitionException Java 8 date/time type LocalDateTime not supported by default jsr310

文章介绍了在使用SpringBoot2.5.1时遇到的LocalDateTime序列化异常,由于Java8的时间类型不被默认支持,提出了三种解决方案:1)使用@JsonSerialize和@JsonDeserialize注解;2)回退SpringBoot版本到2.4.x;3)回退jackson-databind版本到2.11.x。此外,还尝试了注册JavaTimeModule和自定义Jackson2ObjectMapperBuilder,但未解决问题。

一. 报错信息

最近新开了一个测试项目,使用了Java8的LocalDateTime替换了之前使用的Date类。接口返回结果时,抛出了序列化异常:

java.lang.reflect.UndeclaredThrowableException: null
…………
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: 
add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: 
cn.xx.dao.common.Back["data"]->cn.xx.dao.data.vo.BmVo["spe"]->
cn.xx.dao.entity.Spe["createTime"])





二. 版本信息

spring boot:2.5.1
jackson-databind:2.12.3

……
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.1</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
……
<dependencies>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.12.3</version>
          <scope>compile</scope>
      </dependency>
</dependencies>





三. 解决方法

1. 使用@JsonSerialize + @JsonDeserialize注解
  1. pom加上这两个注解的依赖
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.12.3</version>
</dependency>
  1. 在使用LocalDateTime的属性上添加这两个序列化反序列化注解:
@JsonSerialize(using = Loc
### 解决方案 当使用 Jackson 库尝试序列化或反序列化 `java.time.LocalDateTime` 类型的对象时,默认情况下会出现不支持该类型的错误。这是因为 Jackson 默认未提供对 Java 8 新增日期/时间 API 的原生支持。 #### 添加依赖项 为了使 Jackson 支持 `java.time.LocalDateTime`,需要引入额外的模块 `jackson-datatype-jsr310`。可以通过 Maven 或 Gradle 将其添加到项目的构建文件中: 对于 Maven 用户: ```xml <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.12.5</version> </dependency> ``` 对于 Gradle 用户: ```gradle implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.12.5' ``` 此模块扩展了 Jackson 对 Java 8 日期/时间 API 的支持能力[^1]。 #### 配置 Jackson ObjectMapper 在 Spring Boot 环境下,可通过自定义配置类注册 JSR-310 模块至 `ObjectMapper` 实例。以下是实现方式的一个示例: ```java 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 objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); return objectMapper; } } ``` 上述代码片段创建了一个名为 `objectMapper` 的 Bean 并将其注入到 Spring 容器中。通过调用 `registerModule()` 方法,JSR-310 模块被成功注册到了 `ObjectMapper` 上,从而实现了对 `LocalDateTime` 和其他 Java 时间类型的支持[^3]。 如果不在 Spring 环境运行,则可手动实例化并配置 `ObjectMapper` 来完成相同功能。 #### 常见注意事项 尽管引入了必要的依赖和支持模块,在某些场景下仍需进一步调整以满足特定需求。例如设置全局的时间格式或者禁用默认特性等操作可能也是必需的。这些都可以通过对 `ObjectMapper` 进行更详细的定制来达成目标。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值