在使用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解决方案