Spring Boot REST Controller如何同时传MultiPartFile与JSON?遇415错误
问题分析与解决方案
你遇到的415(Unsupported Media Type)错误,核心原因是请求媒体类型与接口参数注解不匹配:
- 当同时传递文件和JSON数据时,实际请求的Content-Type是
multipart/form-data,但你混用了@RequestBody(期望纯JSON请求体)和@RequestPart,且consumes中同时声明了两种不兼容的媒体类型,导致Spring无法正确解析请求。
修复步骤
- 替换
@RequestBody为@RequestPart:@RequestPart专门用于处理multipart/form-data请求中的各个部分,支持解析JSON格式的表单项。 - 调整
consumes配置:只保留MediaType.MULTIPART_FORM_DATA_VALUE,因为整个请求是多部分表单类型,无需单独声明JSON类型。
修改后的代码
@ResponseStatus(value = HttpStatus.CREATED) @PostMapping(value = "/file/new", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<DefaultResponseDto<Object>> createFile(HttpServletRequest servletRequest, @RequestPart @Valid PortfolioFileSaveRequestDto request, @RequestPart MultipartFile file) { List<String> tokenInfo = jwtProvider.authorizeJwt(servletRequest.getHeader(AUTHORIZATION)); // ... 原有业务逻辑代码 Portfolio portfolio = portfolioService.saveFile(request, user.getUsername(), profile, file); // ... 原有业务逻辑代码 }
请求构造说明
以Postman为例,构造请求时需注意:
- 请求方法选择POST,地址填写
/file/new - Body选择
form-data类型 - 添加两个表单项:
- 第一个项的Key为
request,类型选Text,格式切换为JSON,粘贴你的请求体内容 - 第二个项的Key为
file,类型选File,选择要上传的文件
- 第一个项的Key为
额外注意事项
- 确保
PortfolioFileSaveRequestDto类具备正确的Getter/Setter方法(或使用Lombok的@Data注解),保证Jackson能正常解析JSON - 如果请求中表单项的名称与参数名不一致,可通过
@RequestPart("自定义名称")指定映射关系
内容的提问来源于stack exchange,提问作者gs97ahn
相关产品推荐
相关产品推荐

