Feign 接口的定义和参数传递方式
Feign 接口的定义和参数传递方式
这是一个典型的 Feign 参数传递问题
@GetMapping("/public/order/photo/listForYzt")
public ResponseData<OrderPhotoResponseVO> listForYzt(OrderRequestVO orderRequestVO);
问题点:
1. 使用的是 `@GetMapping`(GET 请求)
2. 参数是一个对象 `OrderRequestVO`
3. 没有添加 `@SpringQueryMap` 或 `@RequestParam` 注解
当 Feign 接口使用 GET 请求且参数是对象时,默认不会将对象的字段展开为 URL 查询参数,导致服务端接收不到 `orderNo` 参数。
### 为什么会这样?
- Feign 的 GET 请求需要将参数放在 URL 上作为查询参数(query parameters)
- 直接传对象时,Feign 不知道如何将对象字段映射到 URL 参数
- 服务端收到的请求 URL 可能是:`/public/order/photo/listForYzt`(没有 orderNo 参数)
## 解决方案
有两种方式可以解决这个问题:
### 方案一:使用 `@SpringQueryMap` 注解(推荐)
这是最简洁的方式,Feign 会自动将对象的字段展开为 URL 查询参数:
@GetMapping("/public/order/photo/listForYzt")
public ResponseData<OrderPhotoResponseVO> listForYzt(@SpringQueryMap OrderRequestVO orderRequestVO);
### 方案二:使用 `@RequestParam` 明确指定参数
如果只需要传递单个参数,可以直接使用 `@RequestParam`:
@GetMapping("/public/order/photo/listForYzt")
public ResponseData<OrderPhotoResponseVO> listForYzt(@RequestParam("orderNo") String orderNo);
### 方案三:改用 `@PostMapping` + `@RequestBody`
如果服务端支持 POST 请求,也可以改为 POST 方式:
@PostMapping("/public/order/photo/listForYzt")
public ResponseData<OrderPhotoResponseVO> listForYzt(@RequestBody OrderRequestVO orderRequestVO);
## 推荐方案
推荐使用方案一(`@SpringQueryMap`),原因如下:
代码改动最小 - 只需添加一个注解
语义清晰 - 明确表示将对象展开为查询参数
扩展性好 - 后续如果 `OrderRequestVO` 增加字段,无需修改接口
符合 RESTful 规范 - GET 请求使用查询参数
## 验证方法
修改后,可以通过以下方式验证:
1. 查看日志:开启 Feign 的详细日志,确认 URL 是否包含 `?orderNo=xxx`
2. 断点调试:在服务端的 `listForYzt` 接口打断点,查看参数是否正确接收
3. 直接测试:调用接口,确认不再报 "订单号不能为空" 的错误
浙公网安备 33010602011771号