FeignClient调用服务及上传文件的注意点及问题
目錄
- 代碼示例
- 文件服務接口
- 調用方
- 注意點:
- 2021.3.16更新:發新的坑
- 坑點:
- 原因分析
- 部分異常及解決方案
- 異常一:[Method has too many Body parameters](https://blog.csdn.net/haishiyizhenfeng/article/details/80607003)
- 異常二:[@FeignClient注入找不到的異常](https://blog.csdn.net/qq_28165595/article/details/102328066)
- 異常三:[feign.FeignException$MethodNotAllowed: status 405](https://blog.csdn.net/qq_43371556/article/details/100548389)
- 其他問題
代碼示例
-
文件服務接口
-
調用方
注意點:
2021.3.16更新:發新的坑
坑點:
調用方在接受MultipartFile參數,并傳給服務方時必須保持MultipartFile參數的參數名與服務方一致(即multipartFile.getName()必須與服務方的@RequestPart(value = "xxx") MultipartFile file的value值相同),否則服務方會找不到參數!!!
最近在補充原本的分布式項目時,發現在調用發Controller層接受文件參數后,使用OpenFeign調用文件上傳服務,一直報錯(沒有接受到參數file):
Required request part 'file' is not present報錯時調用方Controller代碼:
/*** @RequestParam(name)MultipartFile[] file* 中的name, 即參數名必須與調用方接口的參數名相同* 否則服務方會報錯Required request part 'file' is not present*/@PostMapping("/upload")public Response<Object> upload(@RequestParam("image")MultipartFile image){Response<Object> res = new Response<>();List<Object> data = new LinkedList<>();//調用服務方的接口Response<LinkedHashMap<Object, Object>> response = fileService.saveFile(image);if(response.getCode()==400){//保存失敗res.fail(response.getDesc());return res;}data.add(response);res.success(data);return res;}服務方代碼:
@PostMapping("/add")public Response<Object> add(@RequestPart(value = "file") MultipartFile file,UploadFile entity,) {Response<Object> res = new Response<>();FileHandlerResult handlerResult = service.saveFile(file);return res;}此時服務方接受不到調用方傳的文件參數。
原因分析
在調用方的Controller中參數為@RequestParam("image")MultipartFile image
輸出image的文件名,可以發現輸出為:image與@RequestParam("image")的參數名一致
而服務方接口需要的文件名 @RequestPart(value = "file") MultipartFile file,即參數名字需要為file,而openfeign傳給服務方的文件參數名為image,因此參數傳遞失敗。
由此可知調用方在接受MultipartFile參數,并傳給服務方時必須保持MultipartFile參數的參數名與服務方一致,否則會找不到參數!!!
部分異常及解決方案
異常一:Method has too many Body parameters
@GetMapping(value="/test") Model test(String arg1, String arg1);異常原因:
- 當使用Feign時,如果發送的是get請求,那么需要在請求的所有參數前加上@RequestParam注解修飾
- @RequestParam是用來修飾參數,不能用來修飾整個對象。
注意:使用@RequestParam修飾參數,請求默認的Content-Type 為 application/x-www-form-urlencoded
@RequestBody用來修飾對象
- Feign中可以有多個@RequestParam,但只能有不超過一個@RequestBody
- 既有@RequestBody也有@RequestParam,那么參數就要放在請求的url中,@RequestBody修飾的就要放在提交對象中。
示例:
public int save(@RequestBody Person p, @RequestParam("userId") String userId);注意:使用@RequestBody修飾參數,請求的默認Content-Type 為 application/json 或 application/xml
異常二:@FeignClient注入找不到的異常
異常原因:
可能為啟動類沒有標注@EnableFeignClients
Springcloud中的服務間調用是通過Feign進行調用的,在調用方服務中,我們需要定義一些帶有@FeignClient注解的接口類。并且在啟動類上加上@EnableFeignClients注解。程序啟動的時候,會檢查是否有@EnableFeignClients注解,如果有該注解,則開啟包掃描,掃描帶有@FeignClient注解的接口。
異常三:feign.FeignException$MethodNotAllowed: status 405
異常原因:
調用方的方法參數沒有標注@RequestParam或參數名與服務接口的參數名不相同
其他問題
- 若是服務接口接受到的文件一直為NULL,請檢測調用方法的文件參數名是否與服務接口文件參數名
- Feign部分版本好像不支持傳文件的同時傳文件的參數(Hoxton.SR1沒有這個問題)
總結
以上是生活随笔為你收集整理的FeignClient调用服务及上传文件的注意点及问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机会主义行为是什么意思 机会主义行为介绍
- 下一篇: Zookeeper入门总结