Spring Boot控制器无法同时接收RequestBody与MultipartFile的问题
解决Spring Boot同时接收JSON参数和MultipartFile的415错误
问题根源
- 无法同时使用
@RequestBody和@RequestPart:@RequestBody用于解析整个请求体为JSON,而multipart/form-data请求由多个独立part组成,两者逻辑冲突。 - 改为全
@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请求配置
- 请求方法选择
POST,URL填写/api/v1/qr-generator。 - 切换到Body标签,选择
form-data格式。 - 添加第一个参数:
- 键名:
request(必须和控制器@RequestPart的参数名一致) - 类型:选择
raw,格式切换为JSON - 输入JSON内容示例:
{ "text": "hello-world", "size": "300x300", "color": "#000000", "backgroundColor": "#ffffff" }
- 键名:
- 添加第二个参数:
- 键名:
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
相关产品推荐
相关产品推荐

