Spring中如何在同一函数中接收自定义对象与MultipartFile?
解决Spring Boot Multipart请求绑定DTO时的HttpMediaTypeNotSupportedException异常
问题原因
你当前的控制器方法中,用@RequestBody注解接收UserSignUpDto对象,但@RequestBody是用来解析JSON/XML格式请求体的。而Postman发送的是multipart/form-data类型的表单请求,Spring无法用@RequestBody解析这种格式的DTO参数,因此抛出HttpMediaTypeNotSupportedException异常。
解决方案
修改控制器方法参数注解
移除UserSignUpDto参数上的@RequestBody,改用@ModelAttribute(或直接省略,Spring会自动按表单字段绑定到DTO对象);同时在@PostMapping中显式指定支持multipart/form-data类型。修改后的代码:
import org.springframework.http.MediaType; @PostMapping(value = "/user", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<?> save(@ModelAttribute UserSignUpDto user, @RequestParam("inpFile") MultipartFile file, BindingResult bindingResult) { System.out.println("Hi there 1"); System.out.println(user.getEmail()); System.out.println(user.getUsername()); if (userService.doesUserExist(user)) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Username already exists."); } userService.setUserProfilePicture(user, file); User savedUser = userService.addUser(user); return ResponseEntity.status(HttpStatus.CREATED).body(savedUser); }Postman请求配置说明
- 请求方法选择POST,URL填写对应
/user路径 - 切换到「Body」标签,选择「form-data」类型
- 添加表单字段:对应
UserSignUpDto的每个字段(如email、username等),类型选「Text」并填入对应值 - 添加文件字段:键名填写
inpFile,类型切换为「File」,选择要上传的文件
- 请求方法选择POST,URL填写对应
注意事项
- 确保
UserSignUpDto类有无参构造函数,并且每个字段都有对应的getter和setter方法,否则Spring无法完成表单数据到DTO的绑定 - 如果DTO字段名和表单中的键名不一致,可在DTO字段上添加
@RequestParam("表单键名")注解单独绑定,或者调整表单的键名与DTO字段名一致
内容的提问来源于stack exchange,提问作者Davido
相关产品推荐
相关产品推荐

