简体   繁体   English

Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 日期/时间类型 `java.time.Instant` 默认不支持

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

After update from Spring Boot 2.4.5 to Spring 2.5.0 I noticed the following exceptions in the application logs:从 Spring Boot 2.4.5 更新到 Spring 2.5.0 后,我注意到应用程序日志中有以下异常:

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.Instant` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: org.telegram.telegrambots.meta.api.objects.Update["my_chat_member"]->org.telegram.telegrambots.meta.api.objects.ChatMemberUpdated["new_chat_member"]->org.telegram.telegrambots.meta.api.objects.ChatMember["untilDateAsInstant"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1514) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1215) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1059) ~[jackson-databind-2.12.3.jar!/:2.12.3]
    at org.springframework.jms.support.converter.MappingJackson2MessageConverter.mapToTextMessage(MappingJackson2MessageConverter.java:279) ~[spring-jms-5.3.7.jar!/:5.3.7]
    at org.springframework.jms.support.converter.MappingJackson2MessageConverter.toMessage(MappingJackson2MessageConverter.java:184) ~[spring-jms-5.3.7.jar!/:5.3.7]
    ... 37 common frames omitted

this is my pom.xml:这是我的 pom.xml:

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

I reverted to Spring Boot 2.4.5 and not everything works fine.我恢复到 Spring Boot 2.4.5,但并非一切正常。 What may be wrong with Spring Boot 2.5.0? Spring Boot 2.5.0 可能有什么问题?

Updated更新

The corresponding GitHub https://github.com/spring-projects/spring-boot/issues/26859对应的GitHub https://github.com/spring-projects/spring-boot/issues/26859

I saw an issue in one of my test classes.我在我的一个测试课程中看到了一个问题。 The problem there was it was creating a new ObjectMapper instance that was not adding the JavaTimeModule.那里的问题是它创建了一个没有添加 JavaTimeModule 的新 ObjectMapper 实例。

Here is a sample test that works in Spring 2.4.5 but fails in 2.5.0/2.5.1 with com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.ZonedDateTime not supported by default Here is a sample test that works in Spring 2.4.5 but fails in 2.5.0/2.5.1 with com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.ZonedDateTime not supported by default

It might be due to the upgrade in the jackson-datatype-jsr310 version可能是jackson-datatype-jsr310版本升级的原因

package net.jpmchase.gti.gtfabric;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;

import java.time.ZonedDateTime;

public class ObjectMapperTest {

    @Test
    public void objectMapperTest() throws Exception{

        ZonedDateTime time = ZonedDateTime.now();
        ObjectMapper o = new ObjectMapper();
        o.writeValueAsString(time);
    }
}

To fix this particular test case had to add an explicit要修复这个特定的测试用例,必须添加一个显式

ObjectMapper o = new ObjectMapper();
o.registerModule(new JavaTimeModule()); 

Perhaps you are not using in your code Object Mapper provided by spring.也许您没有在代码中使用 spring 提供的 Object 映射器。

Wrong way:错误的方法:

ObjectMapper o = new ObjectMapper();

Correct way:正确方法:

@Autowired
Jackson2ObjectMapperBuilder mapperBuilder;

... ...

ObjectMapper mapper = mapperBuilder.build();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将 Spring 从 2.4.1 升级到 2.6.1,默认不支持 `java.time.Instant` 错误 - Upgrading Spring Boot from 2.4.1 to 2.6.1, getting `java.time.Instant` not supported by default error java.time.即时响应 JavaScript 日期 - java.time.Instant response to JavaScript date 为什么不向java.time.Instant添加周数? - Why is adding weeks to java.time.Instant not supported? 为什么Hibernate 5.2支持java.time.Instant,而JPA 2不支持? - Why java.time.Instant is supported in Hibernate 5.2 but not in JPA 2? Mysql 8.0 JDBC 类型 java.time.Instant 使用 JdbcTemplate 不支持转换 - Mysql 8.0 JDBC Conversion not supported for type java.time.Instant using JdbcTemplate Spring Boot - Jersey 客户端 - Jackson 无法构造 `java.time.Instant` 的实例 - Spring Boot - Jersey Client - Jackson Cannot construct instance of `java.time.Instant` Spring MockMvc - 从REST获取java.time.Instant - Spring MockMvc - getting java.time.Instant from REST 如何在 Spring Webflux 中将 java.time.Instant 序列化为 ISO 字符串 - How to serialize java.time.Instant as ISO string in Spring Webflux 无法反序列化`java.time.Instant`类型的值 - jackson - Cannot deserialize value of type `java.time.Instant` - jackson 逗号无法通过java.time.Instant解析 - Comma fails parsing by java.time.Instant
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM