Spring REST接口同时接收@RequestBody与MultipartFile的实现及调用问题
Spring是否支持该实现及Postman调用方案
一、原代码实现不被Spring支持
原代码同时使用@RequestBody和@RequestParam(MultipartFile)的写法存在格式冲突:
@RequestBody要求请求的Content-Type为application/json,用于解析JSON请求体- 文件上传需要请求的
Content-Type为multipart/form-data
一个HTTP请求只能设置一种Content-Type,因此Spring无法同时解析两种格式,这就是你遇到Current request is not a multipart request错误的核心原因。
二、正确的实现方案
推荐使用@RequestPart处理multipart请求中的不同部分,可同时接收JSON数据和文件:
@PostMapping(path = "/v1/cust-advice", produces = "application/json", consumes = "multipart/form-data") public ResponseEntity<ResponseMessage> uploadFile( @RequestPart("custData") CustomerData custData, @RequestPart("file") MultipartFile file) { // 业务逻辑处理 }
@RequestPart能识别multipart请求中不同类型的分片:custData对应JSON格式的对象分片,file对应文件分片,Spring会自动完成解析与类型转换。
三、Postman调用步骤
- 请求方法选择POST,填入接口URL
- 切换到Body标签,选中form-data选项
- 添加第一个参数:
- Key填写
custData - 类型选择Text
- Value中输入JSON格式的CustomerData数据,示例:
{ "name": "张三", "phone": "13800138000" }
- Key填写
- 添加第二个参数:
- Key填写
file - 类型选择File
- 点击右侧Select Files按钮,选择本地待上传文件
- Key填写
- 点击Send发送请求
其他可选方案
若不想使用@RequestPart,可将CustomerData序列化为JSON字符串作为普通参数传递:
@PostMapping(path = "/v1/cust-advice", produces = "application/json", consumes = "multipart/form-data") public ResponseEntity<ResponseMessage> uploadFile( @RequestParam("custData") String custDataJson, @RequestParam("file") MultipartFile file) { // 手动将JSON字符串转为CustomerData对象 ObjectMapper mapper = new ObjectMapper(); CustomerData custData = mapper.readValue(custDataJson, CustomerData.class); // 业务逻辑处理 }
这种方式在Postman调用时,custData参数的Value直接填入JSON字符串即可。
内容的提问来源于stack exchange,提问作者Avishek
相关产品推荐
相关产品推荐

