FeignClient调用服务及上传文件的注意点及问题

目录

代码示例

  • 文件服务接口

	/**
     * 用于上传文传
     * 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
    );
}

注意点:

  1. 参数是文件类型的要用@RequestPart注解
  2. 调用方需要设置ContentType为multipart/form-data,
@PostMapping(value = "xxx", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  1. 调用方的文件参数名必须与服务接口的文件参数名相同,示例中文件参数都为@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没有这个问题)
上一篇:RequestParam


下一篇:怎么实现系统调用wait和exit