OpenFeign远程调用注解及file转MultipartFile遇到的坑

2022-07-27 11:09:59

项目场景:

在微服务项目中,会使用到openFegin来调取其他服务的接口。公司使用的微服务文件上传接口因为部署在线上,而自己本地测试时不方便,遇到上传文件时报错无法快速定位


问题描述:

公司文件上传的服务器是FTP,给出的接口是
@Service
@FeignClient(name="file-system",configuration= FeignSupportConfig.class, fallback= FileUploadFeignServiceFallback.class)
public interface FileUploadFeignService{/**
     *  远程调用服务,上传文件
     * @return
     */
    @PostMapping(value="/file/upload-and-back-merge/{fileStrategy}", produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes= MediaType.MULTIPART_FORM_DATA_VALUE)
    ResultfileUpload(@RequestPart("file") MultipartFile file,
                      @RequestParam("fileName") String fileName,
                      @RequestParam("md5") String md5,
                      @RequestParam("size")long size,
                      @RequestParam(name="chunks", required= false) Integer chunks,
                      @RequestParam(name="chunk", required= false) Integer chunk,
                      @PathVariable(name="fileStrategy") String fileStrategy) throws Exception;}

我在本地测试时直接使用fegin name来调用是不通的


原因分析:

openFeign调用远程服务器也可以在本地进行

1.@FeignClient的name可以调用同一个注册中心的微服务,直接使用该微服务的别名调用
2.@FeignClient的url可以远程调用执行服务器上的微服务,url可以为http:/{url}/path格式,此时name只为名字
3.@FeignClient的path,当url存在时,完整路径为url+path
4.@FeignClient,当name和path存在,url不存在时,完整路径为 name+path,自动拼接http://

可见:这位博主写的不错


解决方案:

根据上述openFegin的使用规则,我在代码中改为:
@Service@FeignClient(name="file-system",url="https://xxx",path="file-system",configuration=FeignSupportConfig.class, fallback=FileUploadFeignServiceFallback.class)publicinterfaceFileUploadFeignService{/**
     *  远程调用服务,上传文件
     * @return
     */@PostMapping(value="/file/upload-and-back-merge/{fileStrategy}", produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes=MediaType.MULTIPART_FORM_DATA_VALUE)ResultfileUpload(@RequestPart("file")MultipartFile file,@RequestParam("fileName")String fileName,@RequestParam("md5")String md5,@RequestParam("size")long size,@RequestParam(name="chunks", required=false)Integer chunks,@RequestParam(name="chunk", required=false)Integer chunk,@PathVariable(name="fileStrategy")String fileStrategy)throwsException;

该接口参数为MultipartFile,文件上传时本地生成的file转为MultipartFile,我在百度上找了一个工具类,但是很显然该工具类有问题,调用接口报400,下面贴一下file转MultipartFile的代码

FileInputStream inputStream=newFileInputStream(file);MultipartFile multipartFile=newMockMultipartFile("file", file.getName(),ContentType.MULTIPART_FORM_DATA.toString(), inputStream);
  • 作者:超多多和刘宝宝的代码世界
  • 原文链接:https://blog.csdn.net/qq_48329942/article/details/119515510
    更新时间:2022-07-27 11:09:59