You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot控制器无法同时接收RequestBody与MultipartFile的问题

解决Spring Boot同时接收JSON参数和MultipartFile的415错误

问题根源

  1. 无法同时使用@RequestBody和@RequestPart:@RequestBody用于解析整个请求体为JSON,而multipart/form-data请求由多个独立part组成,两者逻辑冲突。
  2. 改为全@RequestPart后报415:控制器未声明支持multipart/form-data类型,或请求参数的Content-Type配置错误,导致Spring无法正确解析请求。

代码修复步骤

1. 修改控制器方法

更新@PostMapping的consumes属性,明确支持multipart/form-data,并将所有参数改为@RequestPart:

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.io.IOException;

@PostMapping(
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
        produces = MediaType.IMAGE_PNG_VALUE
)
public ResponseEntity<byte[]> createQrCode(
        @Valid @RequestPart("request") CreateQrRequest request,
        @RequestPart("imageFile") MultipartFile imageFile
) throws IOException {
    // 你的业务逻辑代码
    return null;
}
  • 加@Valid用于触发CreateQrRequest的@NotBlank校验约束(需确保引入校验依赖)。
  • @RequestPart的参数名要和请求中的form-data键名严格对应。

2. 完善CreateQrRequest类

添加无参和全参构造方法,Spring需要无参构造完成JSON反序列化:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;

@Data
@Builder
@NoArgsConstructor  // 新增
@AllArgsConstructor // 新增
public class CreateQrRequest {

    @NotBlank
    private String text;

    @NotBlank
    private String size;

    @NotBlank
    private String color;

    @NotBlank
    private String backgroundColor;
}

Postman请求配置

  1. 请求方法选择POST,URL填写/api/v1/qr-generator。
  2. 切换到Body标签,选择form-data格式。
  3. 添加第一个参数:
    • 键名:request(必须和控制器@RequestPart的参数名一致)
    • 类型:选择raw,格式切换为JSON
    • 输入JSON内容示例:
      {
          "text": "hello-world",
          "size": "300x300",
          "color": "#000000",
          "backgroundColor": "#ffffff"
      }
      
  4. 添加第二个参数:
    • 键名:imageFile(和控制器参数名一致)
    • 类型:选择File,点击Select Files选择本地图片文件。
    • 无需手动设置Content-Type,Postman会自动根据文件类型填充(如image/png)。

依赖检查

确保项目依赖中包含必要组件:

  • Maven(pom.xml):
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>
  • Gradle(build.gradle):
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
}

内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:52:15