Feign傳參注意
最近在用SpringCloud嘗試重構(gòu)以前的項(xiàng)目,使用Feign客戶(hù)端組件來(lái)調(diào)用微服務(wù),經(jīng)常出現(xiàn)參數(shù)傳不過(guò)去變成null的問(wèn)題,網(wǎng)上查了一下發(fā)現(xiàn)feign在參數(shù)上的使用還是有一定的限制的,主要是要注意:
1. 當(dāng)參數(shù)比較復(fù)雜時(shí),feign即使聲明為get請(qǐng)求也會(huì)強(qiáng)行使用post請(qǐng)求
2. 不支持@GetMapping類(lèi)似注解聲明請(qǐng)求,需使用
1
|
@RequestMapping (value = "url" ,method = RequestMethod.GET) |
3. 使用@RequestParam注解時(shí)必須要在后面加上參數(shù)名
寫(xiě)了一個(gè)簡(jiǎn)單案例,同時(shí)傳輸一個(gè)對(duì)象和一個(gè)字符串作為請(qǐng)求參數(shù),主要關(guān)注參數(shù)的聲明,其余比如eureka和feign的依賴(lài)和配置和后續(xù)使用相關(guān)的知識(shí)請(qǐng)另行查閱。僅供參考
服務(wù)端(生產(chǎn)者)
準(zhǔn)備:
1. 已經(jīng)配置將服務(wù)注冊(cè)在eureka,服務(wù)名為“item-service”
2. service層和dao層已經(jīng)實(shí)現(xiàn)好了
邏輯:ItemController接收參數(shù),調(diào)用service層,service中為商品Item對(duì)象添加詳情desc,然后調(diào)用dao保存Item對(duì)象,返回Result結(jié)果封裝對(duì)象
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); } } |
客戶(hù)端(消費(fèi)者)
準(zhǔn)備: 已經(jīng)配置注冊(cè)到eureka
邏輯:
聲明ItemFeignClient調(diào)用eureka上名為"item-service"的服務(wù),返回Result對(duì)象
使用Post請(qǐng)求,傳遞兩個(gè)參數(shù):
1. TbItem對(duì)象,使用@RequestBody來(lái)聲明
2. String字符串,使用@RequestParam("xxx")來(lái)聲明
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參數(shù)傳遞問(wèn)題記錄
對(duì)象傳遞 @RequestBody(required = false)
不支持多對(duì)象傳遞,至少我目前發(fā)現(xiàn)是這樣的,如有錯(cuò)誤或者改進(jìn)的方法請(qǐng)?zhí)岢?/p>
API層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@FeignClient (value = "transaction-feign" ) public interface TransactionApiService { /** * 交易流水查詢(xún) 可分頁(yè) * * @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
|
/** * 交易流水查詢(xún) 可分頁(yè) * @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; } |
單個(gè)或多個(gè)參數(shù)傳遞 @RequestParam/@PathVariable/***
1
2
3
4
5
6
7
8
|
/** * 根據(jù)商戶(hù)號(hào)獲取商戶(hù)信息 * * @param merNo * @return */ @RequestMapping (value = "/merchant/{merNo}" , method = RequestMethod.GET) String getMerchantByMerNo( @PathVariable ( "merNo" ) String merNo); |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/wk52525/article/details/79183113