Spring Boot PostMapping接收MultipartFile与JSON报415错误问题
问题根因
返回415 Content type 'multipart/form-data' not supported 是两个典型配置错误导致的:
- 接口层错误使用
@RequestBody注解接收元数据:multipart/form-data请求由多个独立的内容分片组成,@RequestBody会读取整个请求体作为单一反序列化目标,根本不支持多分片的multipart协议,自然无法识别对应媒体类型。 - 单元测试构造请求的方式完全不符合multipart规范:直接调用
.content()传入JSON字符串,是把JSON作为整个请求体发送,没有将元数据作为独立的multipart分片上传,和接口约定的请求结构不匹配。
你之前移除consumes配置后测试能通过,本质是接口退化为接收纯JSON请求,根本无法正确解析二进制文件分片,只是测试逻辑没有校验文件解析结果才会“假通过”,完全不符合实际文件上传的业务需求。
修复步骤
1. 修正接口参数注解
将元数据参数的@RequestBody注解替换为@RequestPart,显式指定分片名称,Spring会自动根据分片的Content-Type将JSON分片反序列化为FileData对象,修正后的接口代码如下:
@RequestMapping("/files") public interface FileApi { @Operation(summary = "Add a new File and return its id.", tags = {"File Upload"}) @PostMapping(path = "/upload", consumes = {MediaType.MULTIPART_FORM_DATA}) ResponseEntity<String> addFile( @RequestPart(value = "file") final MultipartFile file, // 替换@RequestBody为@RequestPart,指定分片名为fileData @RequestPart(value = "fileData") FileData fileData, @Context final HttpServletRequest request ); }
原有consumes = MediaType.MULTIPART_FORM_DATA配置保留即可,不需要删除,Swagger/OpenAPI会自动识别该接口为multipart上传类型。
2. 修正单元测试的请求构造逻辑
不要直接用.content()传入JSON字符串,需要将JSON元数据作为一个独立的multipart分片传入,同时给该分片指定application/json的Content-Type,Spring才会将其反序列化为Java对象。修正后的测试代码如下:
@Test public void uploadFile_success() throws Exception { // 构造文件分片 final MockMultipartFile file = new MockMultipartFile("file", "test.zip", "text/plain", "test".getBytes()); FileData fileData = new FileData(); fileData.setFilename("bla.zip"); fileData.setDescription("A very nice File"); // 构造JSON元数据分片,指定contentType为application/json,分片名和接口@RequestPart指定的名称一致 MockMultipartFile fileDataPart = new MockMultipartFile( "fileData", "", MediaType.APPLICATION_JSON_VALUE, MAPPER.writeValueAsBytes(fileData) ); String address = "/files/upload"; mockMvc.perform(MockMvcRequestBuilders.multipart(address) .file(file) // 传入元数据分片,不要用.content()直接塞JSON .file(fileDataPart) .contentType(MediaType.MULTIPART_FORM_DATA)) .andExpect(status().isOk()) .andExpect(content().string("OK")) .andReturn(); }
效果说明
改完上述配置后:
- 接口可以正常接收二进制文件+JSON元数据的multipart请求,不会再报415错误
- Swagger UI会自动渲染两个入参项:一个文件上传选择控件、一个JSON格式的元数据编辑框,完全符合文件上传的交互预期
- 不需要额外自定义
MultipartResolver或者修改Spring Boot的默认multipart配置,Spring MVC默认内置了对multipart请求中JSON分片的反序列化支持。
内容的提问来源于stack exchange,提问作者Sascha Effert
相关产品推荐
相关产品推荐

