使用Ajax向Spring服务器发送FormData时如何传递对象列表
解决方案:FormData传递对象列表映射到Spring List
问题背景
通过FormData提交数据到Spring后端时,ExampleRequest中的List<OBJ> objs始终为null。尝试过三种append方式:
- 把对象转成JSON字符串后append为
objs[i] - 直接append对象
objs - 尝试
objs[i].name格式的字段名
但后端接收时objs仍为空,通过request.getParameterMap()查看,objs的值是JSON字符串数组,无法被Spring自动解析为OBJ对象列表。
核心原因
Spring的@ModelAttribute解析表单数据时,需要扁平化的表单字段结构,而非JSON字符串或整个对象。它会根据字段名的层级(如objs[0].name)自动映射到对象列表的属性中。
解决步骤
1. 前端调整:正确构造FormData字段
修改JS中的循环逻辑,逐个append对象的每个属性,使用objs[索引].属性名的格式:
$('#submit-button').click( function () { var objs = [{"name":"n1", "age":10}, {"name":"n2", "age":20}]; var formData = new FormData(); formData.append("title", $('#title').val()); formData.append("summary", $('#summary').val()); formData.append("content", $('#content').val()); // 正确的列表字段构造方式 for (var i=0; i < objs.length; i++) { formData.append("objs[" + i + "].name", objs[i].name); formData.append("objs[" + i + "].age", objs[i].age); } $.ajax({ url: "/example", type: "POST", data: formData, enctype: "multipart/form-data", contentType: false, processData: false }); } )
此时Network中的payload会变成:
title: xxx summary: xxx content: xxx objs[0].name: n1 objs[0].age: 10 objs[1].name: n2 objs[1].age: 20
2. 后端确认配置
确保你的DTO和Controller代码无需额外修改,保持原有结构即可:
DTO代码
public record ExampleRequest( @NotBlank String title, @NotBlank String summary, @NotBlank String content, @NotNull List<OBJ> objs ){} public record OBJ( String name, Integer age ) {}
Controller代码
@PostMapping("/example") public String example( @Validated @ModelAttribute ExampleRequest exampleRequest, BindingResult bindingResult ) { // 此时exampleRequest.objs会正确映射为OBJ列表 return "success"; }
3. 额外注意事项
- 如果项目中存在自定义的WebDataBinder配置,需确保没有覆盖默认的列表解析逻辑。
- 检查
BindingResult中的错误信息,若有字段绑定失败的提示,可针对性调整字段名或类型匹配。
内容的提问来源于stack exchange,提问作者jadekim
相关产品推荐
相关产品推荐

