相信不少人都使用过Spring Cloud, 对其插件Feign一直不陌生, 但是对于Feign转发文件流的问题我发现百度基本都是互相抄无非是以下操作
1.添加Feign-Form与Open-Feign插件(因为feign不支持表单传输)
2.使用@RequsetPart标签不能使用@RequsetParam标签
3.添加Feign配置类(百度一大堆,基本都是一致的,大家可以百度查看源码)
4.如果传输数组重写SpringFormEncoder的encode方法
但是因为本人公司架构设计原因, 需要批量上传, 且需要使用Feign转发至另一服务端. 最开始我也是先百度, 发现于此相关的文章一大堆 , 于是选择了一篇(并无4方法)开始使用到我的项目. 最开始一切都很顺利, 上传一气喝成. 但是问题在于我上传多份文件时, 最终只有一份到达另一方服务端(注意:本地断点上传接口是清清楚楚多份文件流, 到另一服务端时, 只有一份文件流). 于是开始百度搜索Feign传输MultipartFile[]的坑, 于是发现4方法. 基本出于一致全是重写encode方法, 如下
其给出的解释为:Feign-Form的SpringFormEncode只能传输单个MultipartFile, 不能传输多个, 需要手动重写, 但是重写后第一个问题随之出现: 在接受文件流的服务端爆出以下错误
the request was rejected because no multipart boundary was found
这是什么情况??? 一脸懵逼的我几乎搜索完所有百度的文章 , 好了所有文章如出一则 ,出现这种情况的原因是使用@ReqeustParam请改用@RequestPart. 好吧检查完所有地方, 发现没有一处错误, 可依然报错 , 接着搜索, 发现配置类有不同的, 且Feign-Form的版本也是高版本, 还讲了官网文档的不同. 好的,接下来换用3.8.0 的版本. 第二个问题随之出现:在发送Feign的这端出现了NPE !!!! 鉴于喜欢点击错误位置信息的我, 点击进去查看是什么原因爆出了NPE, 但我居然有了意外发现
这一段是不是很眼熟,没错正是我们重写的endcode方法 , 原来Feign-Form3.8.0 已经完善了这方面的缺陷, 根本就不需要我们在重写, 我此刻终于明白大佬们说国内的技术博客基本找不到你想要的东西 . 失望至极 , 于是开始在Google上搜索相关资料文献 , 并找到相关解决方案
上方方法1,2,3,4 都没有错但只能解决单文件传输, 或者多文件时缺少配置, 只能希望国内技术博客能好好提升下质量
1.在解决多文件传输时,导入相关Feign-Form插件是没有错的, 但是需要注意你的版本, 我在低版本中确实没有发现数组类的MultipartFile解决方案需要重写, 但是在高本版中Feign-Form已经完善了这个缺陷,不需要你再重写了 (注:高版本还是低版本取决你的项目版本是高还是低, 否则会有项目版本兼容问题)
2.配置相关配置类: ObjectFactory<HttpMessageConverters> messageConverters;
3.在Feign的发送端导入Feign插件
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId></dependency>并在feign的配置下添加
httpclient: enabled: true个人理解: 此处使用Feign-httpClient是为了解决第一个异常, 使至在转发时, 保留原始HTTP请求
4.Feign的发送端 的两个接口处 (Controller处 与Feign接口处) 使用@ReqestPart , 客户端接收Feign的转发流使用@RequsetParam 并且都使用表单格式传输
(此处为何要修改,目前尚未清楚,欢迎大佬更正解答)
做完以上步骤, 再度批量上传 Bingo!! 花费整整一天时间解决的方案, 于是记录下来, 也欢迎大佬补充和更正
说明:此文章纯属个人原创,转载请说明出处