Feign实现文件传输

Feign实现文件传输

使用feign远程调用上传文件接口踩坑记录:
之前写的一直报错file文件为空。feign.FeignException: status 400 Required request part ‘file‘ is not present问题解决。
1.在feign项目中添加依赖

<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.2.2</version>
	  </dependency>

2.在feign项目中增加配置类

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:  shx
 * Date: 2024/5/15 16:21
 */
@Configuration
public class MultipartSupportConfig {
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }

}

3.feign接口中的client接口中定义文件参数为,其中尤为重要是在@RequestMapping里面增加 method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE(因为我们接口是form-data表单提交所以这边一定要声明)其次就是 用@RequestPart来接收文件参数 MultipartFile file

@RequestMapping(value = "/caseFile/uploadImageAndDrawWatermark", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public BaseResp uploadImageAndDrawWatermark(@RequestPart(value="imgFile", required = false) MultipartFile file,
                                                                      @RequestParam(value="caseFromOrgId", required = false) Integer caseFromOrgId,
                                                                      @RequestParam(value="caseId", required = false) String caseId,
                                                                      @RequestParam(value="taskId", required = false) String taskId,
                                                                      @RequestParam(value="lon", required = false) String lon,
                                                                      @RequestParam(value="lat", required = false) String lat,
                                                                      @RequestParam(value="addr", required = false) String addr,
                                                                      @RequestParam(value="gpsType", required = false) String gpsType,
                                                                      @RequestParam(value="fileTime", required = false) String fileTime,
                                                                      @RequestParam(value="fileInfo", required = false) String fileInfo,
                                                                      @RequestParam(value="fileType", required = false) Integer fileType,
                                                                      @RequestParam(value="fileTypeDesc", required = false) String fileTypeDesc,
                                                                      @RequestParam(value="openId", required = false) String openId,
                                                                      @RequestParam(value="jisName", required = false) String jisName,
                                                                      @RequestParam(value="jisPhone", required = false) String jisPhone,
                                                                      @RequestHeader("from-where") String fromWhere);

4.被调用方接收参数 文件的接收也一定要用 @RequestPart(value=“imgFile”, required = false) MultipartFile file

5.调用方的接口中 MultipartFile的接收可以用@RequestParam也可以用@RequestPart

6.注:调用方和feign还有被调用方三个地方的文件最好统一都用 MultipartFile

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用Feign传递LocalDate格式的问题上,我们需要进行一些额外的处理。 首先,Feign默认使用Java的日期转换机制,它将使用标准的`java.time.format.DateTimeFormatter.ISO_LOCAL_DATE`格式将LocalDate转换为字符串。因此,我们需要确保服务提供者和消费者使用相同的格式。 其次,Feign不支持直接传递LocalDate对象。我们可以通过自定义一个转换器来实现将LocalDate转换为指定格式的字符串,并将其添加到Feign的配置中。 下面是一个使用自定义转换器的示例: 1. 创建一个实现`Encoder`接口的自定义转换器类,例如`LocalDateEncoder`: ```java import feign.RequestTemplate; import feign.codec.Encoder; public class LocalDateEncoder implements Encoder { private final Encoder delegate; public LocalDateEncoder(Encoder delegate) { this.delegate = delegate; } @Override public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException { if (object instanceof LocalDate) { // 将LocalDate转换为指定格式的字符串 LocalDate localDate = (LocalDate) object; String formattedDate = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); // 将字符串设置为请求的body template.body(formattedDate); } else { delegate.encode(object, bodyType, template); } } } ``` 2. 创建一个使用自定义转换器的Feign配置类: ```java import feign.codec.Encoder; @Configuration public class FeignConfig { @Autowired private ObjectFactory<HttpMessageConverters> messageConverters; @Bean public Encoder feignEncoder() { return new LocalDateEncoder(new SpringEncoder(messageConverters)); } } ``` 3. 在服务提供者和消费者的配置文件中分别注入Feign配置类: ```java @Import(FeignConfig.class) @SpringBootApplication public class YourApplication { // ... } ``` 通过以上步骤,我们就能够在Feign中传递LocalDate格式的数据了。请注意,在使用自定义转换器之前,一定要确保服务提供者和消费者都已经正确配置了`java.time.LocalDate`的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值