相关推荐recommended
解决SpringBoot日期序列化问题:[Java 8 datetime type `java.time.LocalDateTime` not supported by default]
作者:mmseoamin日期:2024-04-30

1、问题背景

最近项目在通过sql查询数据的时候,报了如下错误:

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: com.ytx.dependency.common.utils.Result["data"]->com.ytx.ccserverform.modules.data.dto.ViewModelDataVO["list"]->java.util.ArrayList[0]->java.util.HashMap["occurrence_time"])

解决SpringBoot日期序列化问题:[Java 8 datetime type `java.time.LocalDateTime` not supported by default],63ecaf0f2f9445e194ab12e293a03ce6.png,第1张

2、分析过程

异常信息:Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" 

从异常信息中我们解读到 java8 Jackson库在默认情况下不支持LocalDateTime序列化和反序列化。

于是看了数据表的字段,确实有datetime日期类型的字段, java8将 java.time.LocalDateTime 序列化为 JSON 时,就会报以上错误。

3、解决方法

1、配置全局配置(亲测有效)

在Springboot WebMvcConfigurer其全局配置中增加以下配置,代码如下:

@Configuration
public class WebJsonConverterConfig implements WebMvcConfigurer {
    /**
     * 解决Java8 日期序列化问题
     * jackson默认不支持java8 LocalDateTime的序列化和反序列化
     *
     * @param converters
     */
    @Override
    public void extendMessageConverters(List> converters) {
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());
        messageConverter.setObjectMapper(objectMapper);
        converters.add(0, messageConverter);
    }
}

2、用阿里的FastJson替换ObjectMapper

4、总结

对于这个问题解决得方案有很对,核心还是对LocalDate进行进行序列器解析,将LocalDateTime转为Date。大家根据自己得需要选择合适得方案,本文就不一一列举所有方案了。