问题描述
Spring Cloud通过Feign客户端调用HTTP接口,如果返回值中包含LocalDateTime类型(包括其他JSR-310中java.time包的时间类),在客户端可能会出现反序列化失败的错误。错误信息如下:
Caused by:com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2019-11-27T11:04:32')
问题分析
从客户端调用fegin,也是相当于URL传参就相当于经过一次JSON转换,数据库取出‘2019-11-27T11:04:32’数据这时是时间类型,进过JSON之后就变成了String类型,T就变成了字符不再是一个特殊字符,因此String的字符串“2019-11-27T11:04:32”反序列化就会失败
可以结合这两个解决方案深刻理解:
http://blog.didispace.com/Spring-Boot-And-Feign-Use-localdate/
https://www.jianshu.com/p/e0d560d17ee1
问题解决
增加依赖
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.9</version>
</dependency>
字段增加注解
POJO类的LocalDateTime类型字段增加如下注解
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createTime;