返回顶部
首页 > 资讯 > 操作系统 >解决报错InvalidDefinitionException Java 8 date/time type LocalDateTime not supported by default jsr310
  • 169
分享到

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

javaspringspringboot 2023-08-30 12:08:25 169人浏览 独家记忆
摘要

目录 一. 报错信息二. 版本信息三. 解决方法1. 使用@JSONSerialize + @jsonDeserialize注解2. 回退Spring Boot版本3. 回退jackson版本 四. 一些尝试(未解决问

一. 报错信息

最近新开了一个测试项目,使用了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.bootgroupId>    <artifactId>spring-boot-starter-parentartifactId>    <version>2.5.1version>    <relativePath/> parent>……<dependencies>      <dependency>          <groupId>com.fasterxml.jackson.coregroupId>          <artifactId>jackson-databindartifactId>          <version>2.12.3version>          <scope>compilescope>      dependency>dependencies>





三. 解决方法

1. 使用@JsonSerialize + @JsonDeserialize注解

  1. pom加上这两个注解的依赖
<dependency>    <groupId>com.fasterxml.jackson.datatypegroupId>    <artifactId>jackson-datatype-jsr310artifactId>    <version>2.12.3version>dependency>
  1. 在使用LocalDateTime的属性上添加这两个序列化反序列化注解:
@JsonSerialize(using = LocalDateTimeSerializer.class)@JsonDeserialize(using = LocalDateTimeDeserializer.class)private LocalDateTime createTime;

这时序列化正常,接口返回了结果,但是很明显不是我们需要的结果:

{"createTime": [2023,3,20,17,34,37]}
  1. 加上@JsonFORMat来格式化时间,现在就可以正常输出了:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")@JsonSerialize(using = LocalDateTimeSerializer.class)@JsonDeserialize(using = LocalDateTimeDeserializer.class)private LocalDateTime createTime;

InvalidDefinitionException这个报错,大部分博客提供的思路都是这个,理论上没什么问题,但是实际情况可能需要全局处理如LocalDateTime的时间格式,如果为相关的时间字段一个个的加注解,又太过麻烦。所以这种方法只能用于需要处理特定时间格式的字段上。



2. 回退Spring Boot版本

鉴于方法A只能作用于局部,而使用Jackson2ObjectMapperBuilderCustomizer时,仍然无法解决InvalidDefinitionException这个异常问题,只能将Spring Boot回退至2.4.x版本,问题得到解决。
参考:Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default

解决流程:

  1. 设置Jackson2ObjectMapperBuilderCustomizer:
@Configurationpublic class GlobalDateConfig {// 序列化时设置的时间格式private final String formatter = "yyyy-MM-dd HH:mm:ss";    @Bean    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {        return builder -> {            DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern(formatter);            //返回时间数据序列化            builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter));            // 接收时间数据反序列化            builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter));        };    }}
  1. 回退Spring Boot版本至2.4.x
……<parent>    <groupId>org.springframework.bootgroupId>    <artifactId>spring-boot-starter-parentartifactId>    <version>2.4.2version>    <relativePath/> parent>……
  1. 重启执行,问题解决



3. 回退jackson版本

Spring Boot 2.4.x使用的是jackson 2.11.x
Spring Boot 2.5.x使用的是jackson 2.12.x
参考:Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default

  1. 无须修改Spring Boot版本,并显式的指定jackson版本(2.13也报这个错误,原因可以参考这里:a change in Jackson 2.12comment of 2.4 and 2.5
<dependency>    <groupId>com.fasterxml.jackson.coregroupId>    <artifactId>jackson-databindartifactId>    <version>2.11.2version>dependency><dependency>    <groupId>com.fasterxml.jackson.coregroupId>    <artifactId>jackson-coreartifactId>    <version>2.11.2version>dependency><dependency>    <groupId>com.fasterxml.jackson.datatypegroupId>    <artifactId>jackson-datatype-jsr310artifactId>    <version>2.11.2version>dependency>
  1. 使用上文的GlobalDateConfig配置,重启执行,问题解决





四. 一些尝试(未解决问题)

根据Spring Boot的讨论和Stack overflow的一些解决方法做了一些尝试,但是均未成功解决问题。

1. 向自定义ObjectMapper Bean中注册JavaTimeModule

我的项目中,并不存在这种自定义ObjectMapper且将其设置为全局Bean的情况。

如果存在自定义ObjectMapper Bean的情况下,需要注册处理java8时间序列化的类:JavaTimeModule(或者jdk8Module)

@Bean@Primarypublic ObjectMapper objectMapper() {    ObjectMapper objectMapper = new ObjectMapper();    objectMapper.reGISterModule(new JavaTimeModule());    return objectMapper;}

或者:

@Bean@Primarypublic ObjectMapper objectMapper() {    return JsonMapper.builder()            .addModule(new JavaTimeModule())            .build();}

或者

@Resourceprivate Jackson2ObjectMapperBuilder mapperBuilder;@Bean@Primarypublic ObjectMapper objectMapper() {    ObjectMapper build = mapperBuilder.build();    objectMapper.registerModule(new JavaTimeModule());    return objectMapper;}

这几种情况没遇到过,不知道是否可行。总之这里对我的代码不起作用。
此外,JavaTimeModule还支持自定义格式

DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern(formatter);// 添加Java8时间序列化反序列化JavaTimeModule javaTimeModule = new JavaTimeModule();//返回时间数据序列化javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter));//接收时间数据反序列化javaTimeModule.aDDDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter));



2. 设置Jackson2ObjectMapperBuilder类

  1. 设置Jackson2ObjectMapperBuilder类,控制序列化和反序列化操作。

很明显,这个就是实现一个Jackson2ObjectMapperBuilderCustomizer类,与上文中的方法jackson2ObjectMapperBuilderCustomizer作用相同。这里也无法解决开头的问题。

@Configurationpublic class GlobalDateConfig implements Jackson2ObjectMapperBuilderCustomizer {    private final String formatter = "yyyy-MM-dd HH:mm:ss";    @Override    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {        jacksonObjectMapperBuilder.simpleDateFormat(formatter)                .modules(new JavaTimeModule())                .serializationInclusion(JsonInclude.Include.ALWAYS)                .failOnEmptyBeans(false)                .failOnUnknownProperties(false)                .featuresToEnable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN)                .featuresToEnable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);    }}



参考

Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type java.time.Instant not supported by default

来源地址:https://blog.csdn.net/HO1_K/article/details/129675462

--结束END--

本文标题: 解决报错InvalidDefinitionException Java 8 date/time type LocalDateTime not supported by default jsr310

本文链接: https://lsjlt.com/news/382844.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作