使用Feign远程调用时,序列化对象失败

最近在搭建一个SpringCloud的微服务时,遇到了一个问题,在使用Feign远程调用时报错,返回对象没有无参构造方法,有其他的含参数的构造方法。本地自己搭建的微服务目录大概如下,才刚开始,后续会逐渐补充优化迭代,有兴趣的可以fork下地址:

https://github.com/zhanghailang123/MyCloud

给与指导意见。

  • Eureka :注册中心服务端,采用Eureka注册中心

  • EurekaClientA :其中的一个Eureka服务端,命名有点随意,相当于一个数据提供中心,暂时没有使用ORM框架对接数据库,把相应数据写死了,目前只是在练习使用为了方便,后续考虑使用SpringJPA,因为Mb用的太多了

  • FeignZ :feign模块远程调用加负载均衡,而且整合了Hystrix熔断机制,当然目前只做了最简单的Demo,练习下手感

  • HystrixDashboard :Hystrix仪表盘,可以关注下当前的服务器状况[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iElFSJl-1610638015331)(使用Feign远程调用时,序列化对象失败.assets/clipboard.png)]

  • RibbonZ :主要用作于负载均衡,启动时可以启动EurekaClientA 多次指定不同的端口号,来测试下负载均衡,一般都是用Feign直接远程调用,内置了ribbon,这个demo中也是为了测试用的。

  • TurBineZ :用来监控集群的熔断情况。

  • ZuulZ :网关

在这里插入图片描述

接下来进入正题。

场景: 在使用Feign远程调用写死的数据服务EurekaClientA时,报错如下

feign模块如下:
在这里插入图片描述

此处为了复现问题,将熔断逻辑暂时注释掉

在这里插入图片描述

此处报错信息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.example.pojo.Student` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

报错的对象 :org.example.pojo.Student 如下,一个很简单的bean对象:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKoeb8Wz-1610638015338)(使用Feign远程调用时,序列化对象失败.assets/image-20210114230523431.png)]

那为什么会报这个问题呢 :不存在无参构造函数,序列化失败

带着疑问走进报错的地方:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eca8q1oS-1610638015339)(使用Feign远程调用时,序列化对象失败.assets/image-20210114230730277.png)]

可以看到是这个地方 canInstantiate()方法校验没通过。在此处打个断点一探究竟

在这里插入图片描述

这个校验里面内容是:

总之都是校验无参构造函数。如果给调用的student对象加上无参构造函数就可以成功调用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFpjTYoT-1610638015342)(使用Feign远程调用时,序列化对象失败.assets/image-20210114231909848.png)]

构造函数就可以成功调用。**

问题倒不是什么大问题,在搭建服务过程中,只有亲力亲为,切实参与到了,才能感受到各种奇奇怪怪的小问题,也只有这样自己亲自动手,才是收获最大的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐