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需要明确知道每个属性属于列表的第几个元素,所以必须加[索引]标识。
额外注意事项
- 必须保证索引连续:从0开始,不能跳号(比如不能有
people[0]之后直接写people[2]),否则Spring会忽略跳过的部分,甚至导致整个列表绑定失败; - getter/setter不能少:你已经提到模型类有get和set方法,这点很重要——Spring完全依赖这些方法来完成数据注入;
- 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
相关产品推荐
相关产品推荐

