FeignClient GET请求方式无法解析对象参数

简介: FeignClient GET请求方式无法解析对象参数,报java.lang.IllegalArgumentException: method GET must not have a request body

起因

使用微服务架构SpringCloud的远程调用FeignClient各个微服务之前相互调用,其中使用get方法的时候报以下错误

image.png

java.lang.IllegalArgumentException: methodGETmustnothavearequestbody


原因

根本原因是:这个接口的请求方式是GET请求,接受的参数是一个对象(包含多个参数),而通过FeignClient调用的话GET请求方式是无法解析对象的,所以使用上述代码会报Caused by: java.lang.IllegalArgumentException: method GET must not have a request body错。

其实FeignClient是支持对象传递的,但是得是Map形式,而且不能为空,与spring在机制上不兼容,因此无法使用。而spring cloud在2.1.x版本中提供了@SpringQueryMap注解,可以传递对象参数,框架自动解析,只可惜啊,得是2.1.0以后的版本。对于上述第二种接口GET请求只传一个参数,通过FeignClient调用,同样也不支持。报错信息和第一种情况一模一样。




解决方案

方案1:POST请求 + 注解

将ServiceB接口的请求方式改为POST,同时接受的参数前面加上@RequestBody注解,改正后的代码如下:

/**
 * 设备查询
 * @param equipmentQuery
 * @return
*/
@PostMapping("/equipment")
PageResult<Equipment> page(@RequestBody EquipmentQuery equipmentQuery);

方案2:GET请求 + @SpringQueryMap注解

/**
 * 设备查询
 * @param equipmentQuery
 * @return
*/
@PostMapping("/equipment")
PageResult<Equipment> page(@SpringQueryMap EquipmentQuery equipmentQuery);

使用方案2的时候一定要注意Spring Cloud的版本,2.1.x以下的不支持哦,只有2.1.x以上版本才能解析参数。

方案3:GET请求 + @RequestParam("xxx")注解

/**
* 设备详情
*
* @param id
* @return
*/
@GetMapping("/getById")
R<EquipmentVO> info(@RequestParam("id") Integer id);

需要注意的是:

1、spring cloud项目使用FeignClient的时候GET请求方式无法解析对象参数

2、spring cloud项目使用FeignClient的时候GET请求有时候也无法解析单个参数值

目录
相关文章
|
1月前
|
JSON 数据格式
第三方系统或者工具通过 HTTP 请求发送给 ABAP 系统的数据,应该如何解析试读版
第三方系统或者工具通过 HTTP 请求发送给 ABAP 系统的数据,应该如何解析试读版
27 0
|
2月前
|
分布式计算 大数据 数据库连接
maxcompute开发环境问题之参数解析失败如何解决
MaxCompute开发环境是指设置和配置用于开发MaxCompute项目的本地或云端环境;本合集将指导用户如何搭建和管理MaxCompute开发环境,包括工具安装、配置和调试技巧。
|
1月前
|
机器学习/深度学习 算法 编译器
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
47 0
|
3月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
51 0
|
1月前
|
缓存 前端开发 Java
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
34 1
|
5天前
|
前端开发 Java
SpringBoot之实体参数的详细解析
SpringBoot之实体参数的详细解析
10 0
|
5天前
|
Web App开发 前端开发 Java
SpringBoot之请求的详细解析
SpringBoot之请求的详细解析
21 0
|
5天前
|
存储 缓存 Java
SpringBootWeb请求响应之前言及状态码的详细解析
SpringBootWeb请求响应之前言及状态码的详细解析
9 0
|
10天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
15天前
|
SQL Java 数据库连接
深度解析MyBatis核心:探寻其核心对象的精妙设计
深度解析MyBatis核心:探寻其核心对象的精妙设计
22 1
深度解析MyBatis核心:探寻其核心对象的精妙设计

推荐镜像

更多