最近项目在通过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"])
异常信息: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 时,就会报以上错误。
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
对于这个问题解决得方案有很对,核心还是对LocalDate进行进行序列器解析,将LocalDateTime转为Date。大家根据自己得需要选择合适得方案,本文就不一一列举所有方案了。