解决SpringBoot+SpringCloud中feign调用服务传递参数为MultipartFile的问题

时间:2025-04-11 17:39:21

文章目录

  • 前言
  • 一、前期说明
  • 二、使用步骤
    • 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问题解决