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
相关产品推荐
相关产品推荐

