spring boot项目关于LocalDate反序列化失败问题
在实际项目中,经常接口中会涉及到时间字段,但是不同系统用的时间类也不一样,有些用Date,有些用LocalDate,现在A调B服务时,报错如下:
Caused by: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.time.LocalDate]; nested exception is com.fasterxml.jackson.databind.exc.
InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2019-12-06') at
其实解决这个问题也很简单,想办法让其反序列化成功就行。
一、添加jar包
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.7</version>
</dependency>
二、加配置
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class JsonObjectMapperConfig {
@Bean
public ObjectMapper ObjectMapper(){
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(simpleModule);
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
}
然后问题就可以解决了。
三、说明
1、ObjectMapper
Jackson ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是使用Jackson解析JSON最简单的方法;
Jackson ObjectMapper可以从字符串、流或文件解析JSON,并创建Java对象或对象图来表示已解析的JSON。将JSON解析为Java对象也称为从JSON反序列化Java对象;
Jackson ObjectMapper也可以从Java对象创建JSON. 从Java对象生成JSON的过程也被称为序列化Java对象到JSON;
Jackson对象映射器(Object Mapper)可以把JSON解析为用户自定义类对象, 或者解析为JSON内置的树模型的对象;
说白了,就是将json与java对象之间互相转换。
2、配置解释
@Bean
public ObjectMapper ObjectMapper(){
// 可以将各种Module注册到ObjectMapper中,每个Module中可以包含多个反序列化组件
SimpleModule simpleModule = new SimpleModule();
// 添加将long转成String的组件
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(simpleModule);
// 将时间反序列化组件添加到ObjectMapper中
objectMapper.registerModule(new JavaTimeModule());
// 禁止将时间类型数据转换成时间戳
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
再来看看JavaTimeModule
就是添加各种跟时间类型有关的序列化以及反序列化组件。
posted on 2021-04-27 10:27 阿里-马云的学习笔记 阅读(3947) 评论(1) 编辑 收藏 举报