OpenFeign 传参时对象参数丢失的问题

1,261 阅读1分钟

错误代码

调用方 FeignClient 接口

@PostMapping("getList/{currentPage}/{limit}")
CommonResult getList(@PathVariable("currentPage") Integer currentPage,
                     @PathVariable("limit") Integer limit,
                     HospitalQueryVo hospitalQueryVo);

服务提供方 Controller 接口

@PostMapping("getList/{currentPage}/{limit}")
public CommonResult getList(@PathVariable("currentPage") Integer currentPage,
                            @PathVariable("limit") Integer limit,
                            @RequestBody HospitalQueryVo hospitalQueryVo) {
    
    /* 此时的 hospitalQueryVo 参数是 null */
    
    Page<Hospital> page = hospitalService.getList(currentPage,limit,hospitalQueryVo);
    page.getContent();
    return new CommonResult(ResultCodeEnum.SUCCESS,page);
}

分页条件查询的条件对象 hospitalQueryVo 为 null,获取不到,所以导致每次查询都是 “查询所有”

图片描述

(A微服务 调用 B微服务)

80P.png

原因分析

传递对象时,Feign 会将请求变成 POST 请求,所以要在 FeignClient 接口,以及 b 微服务 Controller 接口方,要写成 PostMapping,并在对象参数上加上 @RequestBody 注解!

前端以什么方式提交给 a 微服务都无所谓,最主要是 FeignClient 和 b 微服务接口方的控制! 我出错的原因就是因为在接收参数时,没在对象参数上加上 @RequestBody 注解。

更正后代码

调用方 FeignClient 接口

@PostMapping("getList/{currentPage}/{limit}")
CommonResult getList(@PathVariable("currentPage") Integer currentPage,
                     @PathVariable("limit") Integer limit,
                     @RequestBody HospitalQueryVo hospitalQueryVo);
// 切记切记切记!!!!!这里的 HospitalQueryVo 对象参数一定要写 @RequestBody 注解!!!
// 切记切记切记!!!!!这里的 HospitalQueryVo 对象参数一定要写 @RequestBody 注解!!!
// 切记切记切记!!!!!这里的 HospitalQueryVo 对象参数一定要写 @RequestBody 注解!!!

服务提供方 Controller 接口

@PostMapping("getList/{currentPage}/{limit}")
public CommonResult getList(@PathVariable("currentPage") Integer currentPage,
                            @PathVariable("limit") Integer limit,
                            @RequestBody HospitalQueryVo hospitalQueryVo) {
    
    Page<Hospital> page = hospitalService.getList(currentPage,limit,hospitalQueryVo);
    page.getContent();
    return new CommonResult(ResultCodeEnum.SUCCESS,page);
}

总结

传递对象参数时,要用 POST 方式在双方传递

1、在调用方 FeignClient 接口对象参数前加 @RequestBody

2、在服务提供方 Controller 对象参数前加 @RequestBody