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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:38:10