如何将集合属性绑定到 Spring MVC 中的表单

2022-09-03 02:39:12

我正在尝试使用Spring-MVC将我的一个模型对象绑定到表单的字段。一切正常,只是模型对象的一个属性是无序集合。做这样的事情

    <c:forEach items="${m.items}" var="i" varStatus="itemsRow">
      <form:input path="items[${itemsRow.index}]"/>
    </c:forEach>
    <form:errors path="items" />

对于 List 类型属性可以正常工作,但对于 Set,当它在提交时尝试将输入字段内容绑定到对象属性时,它会引发错误。

春天有没有一些东西可以开箱即用的Sets?


答案 1

我认为它必须是一个有序的集合。例如,Spring 参考中有一个图表,讨论了如何引用属性。它说:

account[2] 表示索引属性帐户的第三个元素。索引属性可以是数组、列表或其他自然排序集合的类型(强调它们)

也许一种方法是向对象添加一个 getter,而不是返回 Set,而是返回 Set.toArray()。然后,您的 items 属性将引用该数组。当然,您不能依赖订购。


答案 2

我认为它不适用于集合的原因是因为不能保证集合的顺序。当您尝试绑定到 post 中的第一个对象时,它可能不是该列表中第一个要呈现的对象。例如,项 [0] 在 GET 和 POST 之间可能不相同。

因此,如果您使用有序的 Set 实现(如 SortedSet 或 TreeSet),它应该可以正常工作。


推荐