Feign进行文件上传时的各种坑

2022-07-27 13:56:37

在使用feign调用服务实现文件上传功能时,会遇到各种各样的问题,下面就我在实现过程中遇到的一些问题进行总结。想直接看最终解决办法的可以跳到4。

1.使用Post请求时我习惯将所有数据装在一个map里,在接收端在逐个读取出来。

Resultupload(@RequestBody Map map)

但是在这里使用这个方法会报错无法读取。换种方法,将每个数据单独发送:

Resultupload(@RequestBody("file") MultipartFile file,@RequestParam("assessId") Integer assessId);

其中第一个数据用RequestBody参考了这篇文章:Feign消费服务时POST/GET请求方式

2.在更换后,传到服务端的file为空,查到数据发现需要将 @RequestBody 改为 @RequestPart,参考文章通过Feign服务实现文件上传

3.随后调试发现又报错:

Current request is not a multipart request

经查阅资料发现需要设置请求content-type为【multipart/form-data】,参考文章Feign传输Multipartfile文件的正确方式,Current request is not a multipart request报错解决

4.随后的结果是:还在报错!

feign.codec.EncodeException: Could not write request: no suitable HttpMessageConverter foundfor request type[org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile] and content type[multipart/form-data]

经过各种搜索资料,试了各种方法,终于用下面的方法试通了。
①增加依赖

<dependency><groupId>io.github.openfeign.form</groupId><artifactId>feign-form</artifactId><version>3.3.0</version></dependency><dependency><groupId>io.github.openfeign.form</groupId><artifactId>feign-form-spring</artifactId><version>3.3.0</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>

②增加配置类

@ConfigurationpublicclassFeignSupportConfig{@Autowiredprivate ObjectFactory<HttpMessageConverters> messageConverters;@Beanpublic SpringFormEncoderfeignFormEncoder(){returnnewSpringFormEncoder();}}

③远程调用接口

@Component@FeignClient(name="assessment", configuration= FeignSupportConfig.class)publicinterfaceAssessUploadInterface{@PostMapping(value="/assessment/upload", consumes= MediaType.MULTIPART_FORM_DATA_VALUE)
    ResultuploadKingData(@RequestPart("file") MultipartFile file,@RequestParam("assessId") Integer assessId)throws Exception;}

④服务接收

@ResponseBody@PostMapping(value="/assessment/upload", consumes= MediaType.MULTIPART_FORM_DATA_VALUE)public ResultuploadKingData(@RequestPart("file") MultipartFile file,@RequestParam("assessId") Integer assessId)throws IOException{}

Feign实现微服务间文件上传(Finchley版本)
完结,撒花

2020-07-29补充:
经过上面的修改后虽然文件可以上传了,但是,部分post的请求在调用服务提供者时直接报错!get请求是正常的!
报错如下

classjava.util.HashMap is not a type supported bythis encoder.

经过查阅资料发现FormEncoderr的encode方法当传送的对象是json格式的字符串的时候,就会调用 _flddelegate.encode,即Encoder.Default的encode方法,而这个Encoder.Default的encode方法判断传送的类型不是String或者byte[],就会抛异常。需要对之前新增的配置文件进行修改。即将配置类

@ConfigurationpublicclassFeignSupportConfig{@Autowiredprivate ObjectFactory<HttpMessageConverters> messageConverters;@Beanpublic SpringFormEncoderfeignFormEncoder(){returnnewSpringFormEncoder();}}

修改为

@ConfigurationpublicclassFeignSupportConfig{@Autowiredprivate ObjectFactory<HttpMessageConverters> messageConverters;//    @Bean//    public SpringFormEncoder feignFormEncoder(){//        return new SpringFormEncoder();//    }@Beanpublic SpringFormEncoderfeignFormEncoder(){returnnewSpringFormEncoder(newSpringEncoder(messageConverters));}}

ok,完美解决。参考:spring cloud feign 上传文件报not a type supported by this encoder解决方案

  • 作者:集中精力改bug
  • 原文链接:https://blog.csdn.net/chengxushan2174/article/details/107639612
    更新时间:2022-07-27 13:56:37