SpringCloud:feign對象傳參和普通傳參及遇到的坑


對象傳參:

#使用@RequestBody來指定傳參對象
@RequestMapping(value = "/v2/matterCode/genCode", method = RequestMethod.POST)
    ResultResponse<String> getCode(@RequestBody MatterCodeBO matterCodeBO);

注意:@RequestBody在一個方法內有且只有一個,不能同時存在兩個!

普通傳參:

#普通傳參使用@RequestParam來指定參數
@RequestMapping(value = "taskApiController/getAll", method = RequestMethod.POST)
List<TaskVO> getAll(@RequestParam("name") String name);

注意:@RequestParam必須指定參數名("name"),否則報錯:RequestParam.value() was empty on parameter 0

 

遇到的坑-1:

首先再次強調Feign是通過http協議調用服務的,重點是要理解這句話,

如果FeignClient中的方法有@PostMapping注解 ,則微服務TaskApiController中對應方法的注解也應當保持一致為@PostMapping,如果不一致,則會報404的錯誤 

調用失敗后會觸發它的熔斷機制,如果@FeignClient中不寫@FeignClient(fallback = TaskFeignClientDegraded.class),會直接報錯

    11:00:35.686 [http-apr-8086-exec-8] DEBUG c.b.p.m.b.c.AbstractBaseController - Got an exception
com.netflix.hystrix.exception.HystrixRuntimeException: TaskFeignClient#getAll() failed and no fallback available.
    at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:819)
    at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:804)

 

遇到的坑-2:

報錯信息:feign.FeignException:status 400 reading xxx#xxxx(String); content:

原因:因為feign的那個方法使用的@ReqestParam注解,這個接收的參數長度過長造成的,這也是feign就算使用post方法,參數也會放在請求地址后面,而不是放在請求體里面。

解決辦法:將參數封裝成對象,使用@RequestBody標明參數

 

文章轉載至:https://blog.csdn.net/uotail/article/details/84673347


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM