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"])
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<HttpMessageConverter<?>> 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。大家根据自己得需要选择合适得方案,本文就不一一列举所有方案了。