FeignClient调用服务及上传文件的注意点及问题
作者:互联网
目录
- 代码示例
- 注意点:
- 部分异常及解决方案
- 异常一:[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)
- 其他问题
代码示例
/**
* 用于上传文传
* UploadFile包含fileName、fileDesc
* 不加@RequestParam等同于@RequestParam(required = false)
*
* @param file 文件
* @param entity 文件的描述
* @return
*/
@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;
}
@FeignClient(value = "file-server")
public interface FileService {
@PostMapping(value = "/static/add", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Response<LinkedHashMap<Object, Object>> saveFile(
@RequestPart(value = "file") MultipartFile file,
@RequestParam(value = "fileName")String fileName,
@RequestParam(value = "fileDesc")String fileDesc
);
}
注意点:
- 参数是文件类型的要用@RequestPart注解;
- 调用方需要设置ContentType为multipart/form-data,
@PostMapping(value = "xxx", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
- 调用方的文件参数名必须与服务接口的文件参数名相同,示例中文件参数都为
@RequestPart(value = "file") MultipartFile file
,参数名不同会导致服务接口接收到的文件为NULL。
部分异常及解决方案
异常一: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,点及,RequestParam,文件,value,调用,参数,file,上传 来源: https://blog.csdn.net/weixin_43966635/article/details/113780651