【Feign】⭐️使用 openFeign 时传递 MultipartFile 类型的参数参考
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥
🏆本篇文章阅读大约耗时三分钟。
⛳️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

![]()
解决方案(一)
(补充:该方法只适用于整个服务使用的 feign 传递参数时不会有 @RequestBody 类型的传递方式,有这种请求和 Multipartfile 类型请求的,可以再往下看)
指定自定义编码器,并且标注请求头,使用 @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、测试
可以正常传递参数并且接收到了服务端的返回值
解决方案(二)
首先很抱歉上面的解决方案没有调研仔细,会影响到下面这种情况

昨儿查了许久找到的简单实现 MultipartFile 类型通过 feign 在服务间传递的方法,今儿发现有别的隐患,如果服务间也有 @Requestbody 类型的参数传递,在上面的解决方法基础上会报错,参数传递失败,场景模拟和解决方案如下:
1、如下使用会有异常,当前服务有别的 feing 定义,并且使用 @RequestBody 注解,调用时客户端直接异常:
feign.codec.EncodeException: class org.example.entity.Email is not a type supported by this encoder.
假设要传递这种请求体


2、解决
在原先自定义的 FeignConfig 基础上调整为以下代码,再次测试 @RequestBody , MultipartFile 类型 以及 @RequestParam 传递都没问题
这样配置的话,前面的那种解决方法中要在 feign 中声明指定配置类的操作也不需要了
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
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 HuangBenben*/
@Configuration
public class FeignConfig {@Beanpublic Encoder feignEncoder(ObjectFactory<HttpMessageConverters> messageConverters) {// 将 Spring 的 HttpMessageConverters 适配为 Feign 的 EncoderEncoder springEncoder = new SpringEncoder(messageConverters);// 包装成支持表单编码的 Encoderreturn new SpringFormEncoder(springEncoder);}
}
这种调整是因为 feign 的自动调整传递形式,详细解释如下:
通过配置 SpringFormEncoder 包装 SpringEncoder,可以同时支持 @RequestBody 的 JSON 参数传递 和 multipartFile 文件上传,但需要满足以下条件:
1. 支持的场景
参数类型 编码方式 触发条件
@RequestBody 对象 JSON(application/json) 方法声明中包含 @RequestBody,且未指定 consumes 类型
@RequestPart 文件 multipart/form-data 方法参数中包含 MultipartFile 类型,且声明 consumes = MediaType.MULTIPART_FORM_DATA_VALUE
2. 自动选择编码的逻辑
JSON 编码(SpringEncoder)
当方法参数标记为 @RequestBody 且未强制指定 consumes 类型时,Feign 会优先使用 SpringEncoder 中的 Jackson2JsonHttpMessageConverter 将对象序列化为 JSON。Multipart 编码(SpringFormEncoder)
当方法参数包含 MultipartFile 且声明 consumes = MediaType.MULTIPART_FORM_DATA_VALUE 时,SpringFormEncoder 会自动切换为 multipart/form-data 编码模式。
![]()
章末
这里简易将使用到自定义编码配置类的 feign 接口统一放到一个调用类中,不要跟正常调用的方法放一起,这里指定了编码配置可能会影响别的方法
文章到这里就结束了~

往期推荐 > > >
【接口负载】✈️整合 Resilience4j 指定接口负载,避免过载
【SpringBoot】⭐️整合 Redis 实现百万级数据实时排序
【SpringBoot】✈️本地集成支付宝支付功能
相关文章:
【Feign】⭐️使用 openFeign 时传递 MultipartFile 类型的参数参考
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时三分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&a…...
Linux中动静态库的制作
1.什么是库 库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个⼈的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统…...
Docker部署sprintboot后端项目
创建Docker网络 docker network create icjs 部署Redis docker run -d \--network icjs \--name redis \-p 6379:6379 \redis:latest数据持久化 docker run --restartalways --network icjs -p 6379:6379 --name redis -v /opt/docker/redis/redis.conf:/etc/redis/redis.c…...
forms实现连连看
说明: forms实现连连看 效果图: step1:C:\Users\wangrusheng\RiderProjects\WinFormsApp2\WinFormsApp2\Form1.cs using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms;namespace …...
多视图几何--立体校正--Fusiello方法
1. 坐标系对齐与正交基构造 目标:构建新坐标系基向量 { e 1 , e 2 , e 3 } \{ \mathbf{e}_1, \mathbf{e}_2, \mathbf{e}_3 \} {e1,e2,e3},使成像平面共面且极线水平对齐。 (1) 基线方向 e 1 \mathbf{e}_1 e1 基线向量由左右相机光心平移向量…...
鸿蒙开发踩坑记录 - 2024S2
wrapBuilder如果想View和ObservedV2做绑定 必须要用 ComponentV2 Param 和 区别 退出两层循环 Builder的传入的参数及时是Trace修饰的也无法刷新组件 折叠屏展开后键盘无法点击 vm是公用的,组件生命周期问题导致 监听键盘高度变化失效 原因:分享面…...
【学Rust写CAD】21 2D 点(point.rs)
源码 //matrix/point.rs use std::ops::Mul; use super::algebraic_units::{Zero, One}; use super::generic::Matrix;/// 点坐标结构体 #[derive(Debug, Clone, Copy, PartialEq)] pub struct Point<X, Y>(Matrix<X, Y, One, Zero, Zero, One>);impl<X, Y>…...
0基础入门scrapy 框架,获取豆瓣top250存入mysql
一、基础教程 创建项目命令 scrapy startproject mySpider --项目名称 创建爬虫文件 scrapy genspider itcast "itcast.cn" --自动生成 itcast.py 文件 爬虫名称 爬虫网址 运行爬虫 scrapy crawl baidu(爬虫名) 使用终端运行太麻烦了,而且…...
鸿蒙NEXT小游戏开发:井字棋
1. 引言 井字棋是一款经典的两人对战游戏,简单易懂,适合各个年龄段的玩家。本文将介绍如何使用鸿蒙NEXT框架开发一个井字棋游戏,涵盖游戏逻辑、界面设计及AI对战功能。 2. 开发环境准备 电脑系统:windows 10 开发工具:…...
deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天
一、软件介绍 文末提供下载 deep-sync开源程序插件导出您的 DeepSeek 与 public 聊天,这是一个浏览器扩展,它允许用户公开、私下分享他们的聊天对话,并使用密码或过期链接来增强 Deepseek Web UI。该扩展程序在 Deepseek 界面中添加了一个 “…...
4. 理解Prompt Engineering:如何让模型听懂你的需求
引言:当模型变成“实习生” 想象一下,你新招的实习生总把“帮我写份报告”理解为“做PPT”或“整理数据表”——这正是开发者与大模型对话的日常困境。某金融公司优化提示词后,合同审查准确率从72%飙升至94%。本文将用3个核心法则+5个行业案例,教你用Prompt Engineering让…...
网络编程—网络概念
目录 1 网络分类 1.1 局域网 1.2 广域网 2 常见网络概念 2.1 交换机 2.2 路由器 2.3 集线器 2.4 IP地址 2.5 端口号 2.6 协议 3 网络协议模型 3.1 OSI七层模型 3.2 TCP/IP五层模型 3.3 每层中常见的协议和作用 3.3.1 应用层 3.3.2 传输层 3.3.3 网络层 3.3.4…...
基于Rust与WebAssembly实现高性能前端计算
引言 随着Web应用的复杂性增加,前端开发者经常面临性能瓶颈。传统JavaScript在处理密集型计算任务(如大数据处理或实时图像渲染)时,往往显得力不从心。而Rust语言凭借其高性能和内存安全特性,结合WebAssembly的接近原生…...
MATLAB 代码学习
1. Cell数组 Cell数组用于存储异构数据,每个元素(称为cell)可以包含不同类型的数据(如数值、字符串、矩阵等)。 1.1 创建Cell数组 直接赋值:使用花括号{}定义内容。 students {Alice, 20, [85, 90, 78…...
SELinux
一、selinux技术详解 SELinux 概述 SELinux,即 Security-Enhanced Linux,意为安全强化的 Linux,由美国国家安全局(NSA)主导开发。开发初衷是防止系统资源被误用。在 Linux 系统中,系统资源的访问均通过程…...
Axios 相关的面试题
在跟着视频教程学习项目的时候使用了axios发送请求,但是只是跟着把代码粘贴上去,一些语法规则根本不太清楚,但是根据之前的博客学习了fetch了之后,一看axios的介绍就明白了。所以就直接展示axios的面试题吧 本文主要内容ÿ…...
Spring Cloud 跨云灾备:如何实现5分钟级区域切换?
引言:云原生时代,区域级故障的致命性与应对 在混合云与多云架构中,单个区域的宕机可能导致全局服务瘫痪(如2023年AWS美东区域故障影响超200家金融系统)。传统灾备方案依赖手动切换DNS或冷备集群,恢复时间长…...
ES6对函数参数的新设计
ES6 对函数参数进行了新的设计,主要添加了默认参数、不定参数和扩展参数: 不定参数和扩展参数可以认为恰好是相反的两个模式,不定参数是使用数组来表示多个参数,扩展参数则是将多个参数映射到一个数组。 需要注意:不定…...
爬虫【feapder框架】
feapder框架 1、简单介绍 简介 feapder上手简单、功能强大的Python爬虫框架,内置AirSpider、Spider、Task、Spider、BatchSpider四种爬虫解决不同场景的需求支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能更有功能强大的爬虫管理系统feaplat为其提供方…...
python如何提取html中所有的图片链接
在Python中,你可以使用BeautifulSoup库来解析HTML内容,并提取其中所有的图片链接(即<img>标签的src属性)。以下是一个示例代码,展示了如何做到这一点: 首先,确保你已经安装了BeautifulSo…...
网络协议之系列
网络协议之基础介绍 。 网络协议之清空购物车时都发生了啥? 。...
LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版
LLaMA Factory微调后的大模型Chat对话效果,与该模型使用vLLM推理架构中的对话效果,可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定:有一半是对的,有一半是无关的。 1、未…...
群体智能优化算法-鹈鹕优化算法(Pelican Optimization Algorithm, POA,含Matlab源代码)
摘要 鹈鹕优化算法(Pelican Optimization Algorithm, POA)是一种灵感来自自然界鹈鹕觅食行为的元启发式优化算法。POA 模拟鹈鹕捕食的两个主要阶段:探索阶段和开发阶段。通过模拟鹈鹕追捕猎物的动态行为,该算法在全局探索和局部开…...
代理模式-spring关键设计模式,bean的增强,AOP的实现
以下是一个结合代理模式解决实际问题的Java实现案例,涵盖远程调用、缓存优化、访问控制等场景,包含逐行中文注释: 场景描述 开发一个跨网络的文件查看器,需实现: 远程文件访问:通过代理访问网络文件 缓存…...
前端实现单点登录(SSO)的方案
概念:单点登录(Single Sign-On, SSO)主要是在多个系统、多个浏览器或多个标签页之间共享登录状态,保证用户只需登录一次,就能访问多个关联应用,而不需要重复登录。 💡 方案分类 1. 前端级别 SS…...
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
前言 BlazorChartjs 是一个在 Blazor 中使用 Chart.js 的库(支持Blazor WebAssembly和Blazor Server两种模式),它提供了简单易用的组件来帮助开发者快速集成数据可视化图表到他们的 Blazor 应用程序中。本文我们将一起来学习一下在 Blazor 中…...
SQL server 2022和SSMS的使用案例1
一,案例讲解 二,实战讲解 实战环境 你需要确保你已经安装完成SQL Server 2022 和SSMS 20.2 管理面板。点此跳转至安装教程 SQL Server2022Windows11 专业工作站SSMS20.2 1,连接数据库 打开SSMS,连接数据库。 正常连接示意图&…...
【每日算法】Day 16-1:跳表(Skip List)——Redis有序集合的核心实现原理(C++手写实现)
解锁O(log n)高效查询的链表奇迹!今日深入解析跳表的数据结构设计与实现细节,从基础概念到Redis级优化策略,彻底掌握这一平衡树的优雅替代方案。 一、跳表核心思想 跳表(Skip List) 是一种基于多层有序链表的概率型数…...
前沿科技:3D生成领域技术与应用分析
以下是关于3D生成领域的详细分析,涵盖技术发展、应用场景、挑战与未来趋势、市场动态及典型案例: 一、技术发展与核心方法 3D表示方法 显式表示:包括点云、网格(三角形或四边形)和分层深度图像(LDI),适合直接操作和渲染,但细节复杂度高。 隐式表示:如神经辐射场(NeR…...
Spring Boot 3.4.3 基于 JSqlParser 和 MyBatis 实现自定义数据权限
前言 在企业级应用中,数据权限控制是保证数据安全的重要环节。本文将详细介绍如何在 Spring Boot 3.4.3 项目中结合 JSqlParser 和 MyBatis 实现灵活的数据权限控制,通过动态 SQL 改写实现多租户、部门隔离等常见数据权限需求。 一、环境准备 确保开发环境满足以下要求: …...

