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

Spring中带附加信息的MultiPartUpload如何映射为POJO对象?

问题解答

结论

可以实现,仅需要调整原有写法中的错误配置即可。

修正后的实现步骤

  • 修正POJO定义
    需把错误的MultipartUpload替换为Spring官方的MultipartFile类型,去掉类名后的多余括号,补充无参构造、getter、setter方法,示例如下:
    public class FileInfo {
        private MultipartFile file;
        private String info;
        
        // 无参构造必须保留
        public FileInfo() {}
        
        // getter & setter
        public MultipartFile getFile() { return file; }
        public void setFile(MultipartFile file) { this.file = file; }
        public String getInfo() { return info; }
        public void setInfo(String info) { this.info = info; }
    }
    
  • 修正Controller接口配置
    不能使用@RequestBody注解(该注解仅适配JSON/XML等非文件请求体),需替换为@ModelAttribute,同时指定接口接收的媒体类型为multipart/form-data,示例如下:
    @PostMapping(value = "{id}/frontPage", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public void createContentPage(@PathVariable long id, @Valid @ModelAttribute List<FileInfo> request) {
        // 编写业务逻辑即可
    }
    

对应请求格式

请求必须使用multipart/form-data编码类型,以最常用的前端JavaScript构造请求为例:

const formData = new FormData();
// 填充第一个文件+附加信息
formData.append('request[0].file', file1); // file1为<input type="file">控件获取的文件对象
formData.append('request[0].info', '第一个文件的描述信息');
// 填充第二个文件+附加信息
formData.append('request[1].file', file2);
formData.append('request[1].info', '第二个文件的描述信息');

// 发起请求,以axios为例
axios.post('/你的接口路径前缀/123/frontPage', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
})

注意事项

  • 确保项目已引入spring-boot-starter-web依赖,Spring Boot会自动配置Multipart解析器,无需额外手动配置。
  • 如果列表映射失败,可以将List<FileInfo>封装到一个父级请求对象中,再用@ModelAttribute绑定父级对象即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:15:03