You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中如何在同一函数中接收自定义对象与MultipartFile?

解决Spring Boot Multipart请求绑定DTO时的HttpMediaTypeNotSupportedException异常

问题原因

你当前的控制器方法中,用@RequestBody注解接收UserSignUpDto对象,但@RequestBody是用来解析JSON/XML格式请求体的。而Postman发送的是multipart/form-data类型的表单请求,Spring无法用@RequestBody解析这种格式的DTO参数,因此抛出HttpMediaTypeNotSupportedException异常。

解决方案

  1. 修改控制器方法参数注解
    移除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);
    }
    
  2. Postman请求配置说明

    • 请求方法选择POST,URL填写对应/user路径
    • 切换到「Body」标签,选择「form-data」类型
    • 添加表单字段:对应UserSignUpDto的每个字段(如email、username等),类型选「Text」并填入对应值
    • 添加文件字段:键名填写inpFile,类型切换为「File」,选择要上传的文件

注意事项

  • 确保UserSignUpDto类有无参构造函数,并且每个字段都有对应的getter和setter方法,否则Spring无法完成表单数据到DTO的绑定
  • 如果DTO字段名和表单中的键名不一致,可在DTO字段上添加@RequestParam("表单键名")注解单独绑定,或者调整表单的键名与DTO字段名一致

内容的提问来源于stack exchange,提问作者Davido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:38:10