Spring Boot接口报错:不支持multipart/form-data媒体类型
解决方案:HttpMediaTypeNotSupportedException 处理方案
问题根源
你的接口使用@RequestBody接收JSON格式数据,但请求发送的是multipart/form-data类型(包含文件上传),Spring的@RequestBody默认仅支持application/json等非表单媒体类型,因此触发媒体类型不支持的异常。
具体修改步骤
1. 调整接口注解与参数绑定
去掉@RequestBody,改用@ModelAttribute(或直接省略,Spring会自动绑定表单数据),同时在@PostMapping中明确指定支持multipart/form-data类型:
import org.springframework.http.MediaType; @PostMapping(value = "/modificar-produto/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Transactional public ResponseEntity<Object> modificarProduto(@PathVariable Long id, @Valid @ModelAttribute DadosAtualizacaoProduto dadosAtualizacao, @RequestParam boolean deletarImagem, @RequestParam int posicaoImagem) throws IOException { // 原有业务逻辑保持不变 }
2. 确保实体类字段类型正确
检查DadosAtualizacaoProduto中的imagem字段,必须定义为MultipartFile类型(用于接收上传的文件):
如果是record类型:
import org.springframework.web.multipart.MultipartFile; public record DadosAtualizacaoProduto( String nome, String descricao, BigDecimal preco, MultipartFile imagem ) {}
如果是普通类:
import org.springframework.web.multipart.MultipartFile; public class DadosAtualizacaoProduto { private String nome; private String descricao; private BigDecimal preco; private MultipartFile imagem; // 必须提供getter和setter方法 // getter... // setter... }
3. 调整请求发送方式
确保请求使用multipart/form-data格式提交:
- 在Insomnia/Postman中选择
form-data选项 - 分别添加
nome、descricao、preco等文本参数(对应实体类字段) - 添加
imagem字段,类型选择File并上传文件 - 同时携带
deletarImagem和posicaoImagem两个请求参数
为什么之前@ModelAttribute无效?
大概率是以下原因:
- 没有在
@PostMapping中指定consumes = MediaType.MULTIPART_FORM_DATA_VALUE,Spring无法识别要处理表单数据 DadosAtualizacaoProduto中的imagem字段类型不是MultipartFile,无法绑定上传的文件- 请求参数名与实体类字段名不匹配(比如请求里的参数是
image,但实体类里是imagem)
内容的提问来源于stack exchange,提问作者Javed386
相关产品推荐
相关产品推荐

