文章目录
- 前言
- 一、前期说明
- 二、使用步骤
- 1.引入maven依赖
- 2.新建feign的配置类
- 客户端
- 3.被调用的服务的Controller
- 4.第三方服务远程调用主服务传递MultiPartFile
- 三、参考博客
前言
本文解决了SpringBoot+SpringCloud在引用feign远程调用服务时传递的参数类型为MultipartFile的问题。
一、前期说明
feign服务之间的调用,传参默认的格式为:ContentType=application/x-www-form-urlencoded。
我们需要模拟表单来传递参数,以表单的形式传参时,文件流的传参,需要ContentType为form-data,不然会报错。
二、使用步骤
1.引入maven依赖
依赖坐标如下(应该是只需要feign-form-spring和feign-form两个依赖):
需要注意的是,如果SpringBoot版本是以上的,下面的两个依赖的版本不低于3.5.0,否则引入的依赖无效。
<!--spring feign form 表单提交相关-->
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.8.0</version>
</dependency>
<!--feign form 表单提交相关-->
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.8.0</version>
</dependency>
<!--文件上传相关依赖-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--添加Springboot对MultipartFile的类库支持,在spring-test包中-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
2.新建feign的配置类
将feign的配置类注册到容器中:
/**
* @description : 解决feign传递流数据的异常
*/
@Configuration
public class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
@Primary
@Scope("prototype")
public Encoder multipartFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
@Bean
public feign.Logger.Level multipartLoggerLevel() {
return Logger.Level.FULL;
}
}
客户端
@Service
@FeignClient(value = "CLOUD-XAJ-MODEL", configuration = MultipartSupportConfig.class)
public interface XajModelService {
@RequestMapping(value = "/xajmodel", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R xajModel(@RequestPart("datafile") MultipartFile inputFile);
}
-
@FeignClient(value = “CLOUD-XAJ-MODEL”, configuration = ):”在feign客户端标明会使用刚刚注册到容器里的配置类。
-
@RequestMapping(value = “/xajmodel”, method = , produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE):表明传参格式。
-
MultiPartFile前面的注解用@RequestPart。
3.被调用的服务的Controller
@RequestMapping(value = "/xajmodel", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R xajModel(@RequestParam("datafile") MultipartFile inputFile){
......//具体服务里面的代码
}
- 也需要指定一下传参格式:consumes = MediaType.MULTIPART_FORM_DATA_VALUE
4.第三方服务远程调用主服务传递MultiPartFile
//从本地读取作为远程调用的参数文件(模拟远程调用的效果)
File file = new File("C:\\Users\\dingy\\Desktop\\cloud-xaj-root\\");
InputStream inputStream = new FileInputStream(file);
MultipartFile inputFile = new MockMultipartFile("datafile", file.getName(), /*这里我填的"datafile"这个名字应该和你被调用Controller里的@RequestParam("datafile")注解里标明的名字保持一致*/
MediaType.MULTIPART_FORM_DATA_VALUE, inputStream);
//下面一行就是正式调用新安江模型服务。
R result = xajModelService.xajModel(inputFile, itime, W, WU, WL, S, FR, K, B, C, WM, WUM, WLM, IM, SM, EX, KG, KI, CI, CG, Area, QI1, QG1, Qout1, CS, L, Mk, Mx, n);
//把新安江计算结果取出来在控制台打印一下
List<Double> data = (List<Double>) result.get("data");
for (Double i : data) {
System.out.println(i);
}
三、参考博客
参考博客1:Springboot+ SpringCloud FeignClient发送MultipartFile
参考博客2:feign传参MultipartFile问题解决