💥💥????歡迎閱讀本文章????💥💥
🏆本篇文章閱讀大約耗時三分鐘。
??motto:不積跬步、無以千里
📋📋📋本文目錄如下:🎁🎁🎁
目錄
前言
模擬
解決方案
章末
前言
? ? ? ? 小伙伴們大家好,這篇文章主要描述下最近在開發時遇到的一個服務之間通過 openFeign 調用時遇到的參數傳遞問題,如題目所述,該參數類型正是 MultipartFile。
? ? ? ? 在網上有很多解決方案,比如另外引入 feign + spring 的聯合依賴(叫什么記不住了),或者轉換成字節數組傳遞,接收方再轉換為 MultipartFile 對象(要引入MockMultifile 依賴,應該是這個),然后還有本文使用的這種方案(不用引入依賴,改動也不多)
? ? ? ? 先來模擬下大致的使用場景,也可以直接跳過模擬看解決方案(環境不同,也可能解決不了各位的問題,請諒解)
模擬
? ? ? ? 本地模擬就以兩個簡單服務之間的調用實現,對應一個客戶端,一個服務端,場景就是從客戶端調用服務端的接口,中間需要傳遞 MultipartFile 類型的參數,要怎么成功把參數傳遞到服務端
? ? ? ? 1、客戶端會暴露一個接口,參數為 MultipartFile 類型的 file 參數,然后通過 feign 調用服務端的接口,feign 配置也很簡單,指定了服務端地址和定義了一個方法
? ? ? ? 2、服務端
? ? ? ? 提供的方法很簡單,打印 file 的大小,然后返回給客戶端該參數的 大小+原始名稱
? ? ? ? 3、測試
? ? ? ? 目前這種情況,在調用客戶端暴露的接口,參數可以成功傳到客戶端,但是從客戶端傳到服務端的時候會遇到異常,服務端提示異常如下:
Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Current request is not a multipart request] with root cause
解決方案
? ? ? ? 指定自定義編碼器,并且標注請求頭,使用 @RequestPart 注解標注參數。具體實現案例如下:
? ? ? ? 1、編碼配置類
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author HuangBenben */
@Configuration
public class FeignConfig {@Beanpublic Encoder devEncoder() {return new SpringFormEncoder(); // 使用 SpringFormEncoder 實現 Encoder 接口}
}
? ? ? ? 2、feign 接口指定編碼和請求頭以及參數注解
????????@FeignClient 注解中指定 configuration 的值為 自己創建的編碼配置類
? ? ? ? 具體的方法定義加上對應請求頭
? ? ? ? 使用 @RequestPart 注解
? ? ? ? 3.服務端調整
? ? ? ? 服務端在接收參數時也使用 @RequestPart 注解
? ? ? ? ?4、測試
? ? ? ? 可以正常傳遞參數并且接收到了服務端的返回值
?
章末
? ? ? ? 這里簡易將使用到自定義編碼配置類的 feign 接口統一放到一個調用類中,不要跟正常調用的方法放一起,這里指定了編碼配置可能會影響別的方法
? ? ? ? 文章到這里就結束了~
往期推薦 > > >?
?【接口負載】??整合 Resilience4j 指定接口負載,避免過載
?【SpringBoot】??整合 Redis 實現百萬級數據實時排序
?【SpringBoot】??本地集成支付寶支付功能
????