Feign传参注意
最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上的使用还是有一定的限制的,主要是要注意:
1. 当参数比较复杂时,feign即使声明为get请求也会强行使用post请求
2. 不支持@GetMapping类似注解声明请求,需使用
1
|
@RequestMapping (value = "url" ,method = RequestMethod.GET) |
3. 使用@RequestParam注解时必须要在后面加上参数名
写了一个简单案例,同时传输一个对象和一个字符串作为请求参数,主要关注参数的声明,其余比如eureka和feign的依赖和配置和后续使用相关的知识请另行查阅。仅供参考
服务端(生产者)
准备:
1. 已经配置将服务注册在eureka,服务名为“item-service”
2. service层和dao层已经实现好了
逻辑:ItemController接收参数,调用service层,service中为商品Item对象添加详情desc,然后调用dao保存Item对象,返回Result结果封装对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@RestController public class ItemController { @Autowired private ItemService itemService; /** * 添加 * @param item * @param desc * @return */ @RequestMapping ( "/item/save" ) public Result addItem( @RequestBody Item item, @RequestParam ( "desc" ) String desc){ return itemService.addItem(item, desc); } } |
客户端(消费者)
准备: 已经配置注册到eureka
逻辑:
声明ItemFeignClient调用eureka上名为"item-service"的服务,返回Result对象
使用Post请求,传递两个参数:
1. TbItem对象,使用@RequestBody来声明
2. String字符串,使用@RequestParam("xxx")来声明
1
2
3
4
5
6
7
8
9
10
11
|
@FeignClient ( "item-service" ) public interface ItemFeignClient { /** * 添加 * @param item * @param desc * @return */ @RequestMapping (value = "/item/save" ,method = RequestMethod.POST) Result addItem( @RequestBody TbItem item, @RequestParam ( "desc" ) String desc); |
SpringCloud feign参数传递问题记录
对象传递 @RequestBody(required = false)
不支持多对象传递,至少我目前发现是这样的,如有错误或者改进的方法请提出
API层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@FeignClient (value = "transaction-feign" ) public interface TransactionApiService { /** * 交易流水查询 可分页 * * @param param * @param pageNum * @param pageSize * @return */ @RequestMapping (value = "/dealflow/list" , method = RequestMethod.POST) JsonResultDO dealFlowList( @RequestBody (required = false ) DealFlowDo param , @RequestParam (value = "pageNum" , defaultValue = "1" ) Integer pageNum , @RequestParam (value = "pageSize" , defaultValue = "20" ) Integer pageSize); } |
接口层
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/** * 交易流水查询 可分页 * @return JsonResultDO */ @RequestMapping (value = "/dealflow/list" , method = RequestMethod.POST) public Page<DealFlowDo> dealFlowList( @RequestBody (required = false ) DealFlowDo param , @RequestParam (value = "pageNum" , defaultValue = "1" ) Integer pageNum , @RequestParam (value = "pageSize" , defaultValue = "20" ) Integer pageSize , @RequestParam (value = "userId" ) Long userId){ JsonResultDO resultDO = new JsonResultDO(); Page<DealFlowDo> page = (Page<DealFlowDo> )dealFlowService.queryDealFlowList(userId, param, pageNum, pageSize); return page; } |
单个或多个参数传递 @RequestParam/@PathVariable/***
1
2
3
4
5
6
7
8
|
/** * 根据商户号获取商户信息 * * @param merNo * @return */ @RequestMapping (value = "/merchant/{merNo}" , method = RequestMethod.GET) String getMerchantByMerNo( @PathVariable ( "merNo" ) String merNo); |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/wk52525/article/details/79183113