首頁 > 軟體

SpringCloud:feign物件傳參和普通傳參及遇到的坑解決

2022-03-16 10:00:08

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標明引數

feign傳遞複雜引數物件需要注意的地方

傳遞複雜引數物件需要用Post

另外需要注意,Feign不支援使用GetMapping 和PostMapping

@RequestMapping(value="user/save",method=RequestMethod.POST)

在傳遞的過程中

複雜物件使用@RequestBody進行註解,同時接收端也需要使用@RequestBody這個註解。 

我遇一個坑:

消費端使用了@RequestBody而伺服器端沒有接收@RequestBody,這時引數會接收不完整。

//消費端
    @RequestMapping(value="user/save",method=RequestMethod.POST)
    public User save(@RequestBody User user);
//伺服器端
@PostMapping("save")
    public User save(@RequestBody User user) {
        System.out.println(user);
        return UserService.save(user);
    }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com