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

Spring MVC如何将批量文本输入绑定为Java对象列表?

Spring MVC 表单绑定对象列表的正确方法

你遇到的问题很典型——Spring MVC对对象列表的绑定规则和基本类型列表不一样,不是直接用name或者people.name就能搞定的,必须用索引下标明确每个对象的属性归属,而且索引得从0开始连续排列。

先给你能直接用的正确写法

把你的HTML改成这样:

<form method="post" id="myForm" enctype="multipart/form-data">
  <li>
    <input type="hidden" name="people[0].name" value="James"/>
    <input type="hidden" name="people[0].surname" value="Bond"/>
  </li>
  <li>
    <input type="hidden" name="people[1].name" value="Will"/>
    <input type="hidden" name="people[1].surname" value="Smith"/>
  </li>
  <button type="submit">提交</button>
</form>

为什么原来的写法无效?

咱们拆解下问题:

  • 直接写name="name":Spring会把这个当成独立的请求参数,和你封装表单的模型类里的List<Person>完全不沾边,自然不会封装进去;
  • 写name="people.name":这种语法是给单个Person对象用的(比如如果你的模型是private Person people;),但对于列表,Spring需要明确知道每个属性属于列表的第几个元素,所以必须加[索引]标识。

额外注意事项

  1. 必须保证索引连续:从0开始,不能跳号(比如不能有people[0]之后直接写people[2]),否则Spring会忽略跳过的部分,甚至导致整个列表绑定失败;
  2. getter/setter不能少:你已经提到模型类有get和set方法,这点很重要——Spring完全依赖这些方法来完成数据注入;
  3. Multipart表单的兼容性:你的表单用了enctype="multipart/form-data",只要Spring配置了MultipartResolver(如果有文件上传需求的话),这种绑定方式完全没问题,普通文本数据不受影响。

对应Java代码示例(供参考)

模型类:

// 封装表单数据的顶层类
public class FormModel {
    private List<Person> people;

    // 必须的getter和setter
    public List<Person> getPeople() {
        return people;
    }

    public void setPeople(List<Person> people) {
        this.people = people;
    }
}

// Person实体类
public class Person {
    private String name;
    private String surname;

    // 同样需要getter和setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }
}

控制器方法:

@PostMapping("/submit")
public String processForm(@ModelAttribute FormModel formModel) {
    // 这里formModel.getPeople()就会包含两个Person对象,属性分别对应表单里的值
    return "success";
}

如果是动态添加表单条目(比如前端JS新增Person行),记得每次新增时用当前已有条目的数量作为新条目的索引,保证索引连续,这样Spring就能正确识别所有列表项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:30:30