feign文件上传终极解决方案
maven需要增加依赖
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.4.1</version>
</dependency>
配置类 Config.java
.
package com.scen.web.config;
import feign.Logger;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 注解配置
*
* @author Scen
* @date 2018/4/18 18:31
*/
@Configuration
public class Config {
/**
* 打开feign的日志
*
* @return
*/
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
/**
* 涉及文件传输配置
*/
class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
}
feign客户端需要加的注解
@RequestMapping(value = "/upload", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
void upload(
@RequestPart("file") MultipartFile file,
) throws Exception;
思路:直接传没有任何报错,但是每次都会进入熔断器,遂注释掉熔断器,发现走不到断点就报了个Jackson相关错误(怀疑是远程传输序列化问题),定位到是encoder这个家伙出现的问题,翻了众多资料源码终于解决!同时解决一个feign客户端同时有上传文件方法和其他普通方法调用报错的问题!
2019-01-08更新:3.4.1版本这种方案正常用,更高的版本试了一下依然报错,目前没解决升级版本后又回退了 o(╯□╰)o