我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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)]

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

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

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

这个校验里面内容是:

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

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

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

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

Feign做远程调用的注意点

在使用feign的过程中遇到了一些问题,所以在这里做以下总结

1.定义的做远程调用的api接口

中的方法参数列表中的参数都必须都要打上@RequestParam(“value”) 注解**,否则调用会报405异常,这一点是和controller中不一样的,controller中的方法只要参数名和前台传入的参数键名对应上就能自动绑定上参数

复杂类型用必须打上@RequestBody注解

2.service微服务中的Controller的参数绑定

如果参数列表中有复杂类型,请使用Post请求,使用Get请求会报Bad Request错误,且需要打上@RequestBody注解,而普通基本类型可以不用打上@RequestParam注解可自动绑定参数

如有其它问题,也欢迎补充,放一下代码:

api:


@FeignClient("MS-ADMIN-SERVICE")
public interface FixFeignService {
    @GetMapping("/fix")
    public List<FixInfo> findAll();
    @PostMapping("/fix/add")
    public int insert(@RequestBody FixInfo fixInfo);
    @PostMapping("/fix/limitByParam")
    public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo, @RequestParam("page") Integer page, @RequestParam("limit") Integer limit);
    @PostMapping("/fix/delByIds")
    public boolean delByIds(@RequestParam("ids[]") Long[] ids);
    @GetMapping("/fix/findById")
    public FixInfo findById(@RequestParam("id") Long id);
    @PostMapping("/fix/update")
    boolean update(@RequestBody FixInfo fixInfo);
}

service微服务


@RestController
@RequestMapping("/fix")
@Slf4j
public class FixInfoController {
    @Autowired
    private FixInfoService fixInfoService;
    @GetMapping("")
    public List<FixInfo> findAll(){
        List<FixInfo> all = fixInfoService.findAll();
        return all;
    }
    @PostMapping("/add")
    public int insert(@RequestBody FixInfo fixInfo){
        return fixInfoService.insert(fixInfo);
    }
    @PostMapping("/limitByParam")
    public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo,Integer page,Integer limit){
        LayUIPageBean layUIPageBean = new LayUIPageBean();
        PageHelper.startPage(page,limit);
        List<FixInfo> all = fixInfoService.findByParam(fixInfo);
        PageInfo<FixInfo> pageInfo = new PageInfo<>(all);
        return layUIPageBean.setCount((int)pageInfo.getTotal()).setData(pageInfo.getList());
    }
    @PostMapping("/delByIds")
    public boolean delByIds(@RequestParam("ids[]") Long[] ids){
        //log.info("id"+ids[0]);
        boolean flag= fixInfoService.delByIds(ids);
        return flag;
    }
    @GetMapping("/findById")
    public FixInfo findById(Long id){
        return fixInfoService.findById(id);
    }
    @PostMapping("/update")
    public boolean update(@RequestBody FixInfo fixInfo){
       return fixInfoService.update(fixInfo);
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Feign远程调用时序列化对象失败怎么解决

本篇内容介绍了“使用Feign远程调用时序列化对象失败怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Feign远程调用序列化对象失败
2023-06-20

Sql Server2008远程过程调用失败的解决方法

今天正在敲机房,清理软件提醒垃圾太多并且电脑也特别卡,我就想着既然这样就清理一下得了,结果就是:No zuo No die,SQL server数据库连接不上了。不过从另一方面来说这也是一次学习的机会,在问题中成长。问题:
2023-05-30

Feign远程调用参数里的内容丢失如何解决

这篇文章主要讲解了“Feign远程调用参数里的内容丢失如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Feign远程调用参数里的内容丢失如何解决”吧!Feign远程调用参数里面内容丢失
2023-06-29

VSCODE使用ssh远程连接时启动服务器失败问题及解决方法

VSCode使用SSH远程连接时启动服务器失败,可能原因包括SSH连接配置错误、服务器防火墙阻止连接、服务器资源不足或VSCode设置不当。解决方法包括检查SSH配置、服务器资源、VSCode设置,以及检查服务器应用程序配置。若上述步骤无法解决问题,可尝试高级故障排除,如启用VSCode远程调试、检查服务器日志、分析VSCode日志或使用SSH隧道。
VSCODE使用ssh远程连接时启动服务器失败问题及解决方法
2024-04-02

win8.1安装程序提示DllRegisterServer的调用失败错误代码为0×80070005的解决方法

有些用户遇到在win8.1系统安装软件失败提示模块"Wintrust.dll"已加载,但对DllRegisterServer的调用失败,错误代码为0×80070005,具体问题现象如下所示: 故障原因分析: 有关问题的详细信息,
2022-06-04

如何解决电脑提示应用程序正常初始化(0xc0000142)失败的问题

电脑提示应用程序正常初始化(0xc0000142)失败的问题可能是由多种原因引起的。以下是一些常见的解决方法:1. 重启电脑:有时候,只需简单地重启电脑即可解决该问题。尝试重新启动电脑,看看是否解决了应用程序的初始化问题。2. 更新或重新安
2023-09-07

SQLServer 错误 12304 在本机编译的存储过程外部使用内存优化表类型时,如果该类型对表的任意列使用 IDENTITY 属性,则该类型不受支持。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 12304 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 HK_UNSUPPORTED_IDENTITY_TABLE_VAR ...
SQLServer 错误 12304 在本机编译的存储过程外部使用内存优化表类型时,如果该类型对表的任意列使用 IDENTITY 属性,则该类型不受支持。 故障 处理 修复 支持远程
2023-11-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录