16

我正在尝试使用 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 在提交时尝试将输入字段内容绑定到对象属性时会引发错误。

Spring 中有什么东西可以与 Sets 一起使用吗?

4

6 回答 6

5

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

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

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

于 2008-11-12T16:32:34.460 回答
3

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

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

于 2008-12-01T15:52:07.387 回答
2

在这里找到完美的解决方案:http: //forum.springsource.org/showthread.php?45312-Submitting-arrays

总体思路 - 使用 commons-collections 方法初始化列表:

private List someList = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(com.abc.xyz.SomeClass.class));
于 2012-10-26T10:05:12.083 回答
1

您可以尝试编写自己的自定义编辑器来完成这项工作,然后将编辑器注册到表单的控制器。您不必费心以这种方式索引 Set 中的元素。如前所述,如果有一种对元素进行排序的方法,则可以使用 SortedSet 确保它们在集合中的顺序。

于 2008-12-02T16:07:18.883 回答
1

我不清楚这到底是如何绑定的,但它适用于我的目的。

 <c:forEach items="${items}" var="i" varStatus="itemsRow">
        <input name="items[${itemsRow.index}].fieldName" type="text"/>
    </c:forEach>
 <form:errors path="items" />
于 2008-11-12T16:40:27.503 回答
-1

如果您使用对对象 ID 的数字引用,并且注册了适当的 Converter 实现,则可以使用分号分隔的列表。

POST 数据排行榜=1,2

转换器实现(忽略 JSON 的东西)

    public final class LeaderboardConverter extends JsonDeserializer<Leaderboard> implements Converter<String, Leaderboard>
    {
        public Leaderboard convert(String source) throws IllegalArgumentException
        {
            Leaderboard activity = new Leaderboard();
            activity.setId(new Integer(source));
            return activity;
        }


        public Leaderboard deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
        {
            return convert(jp.getText());
        }

}
于 2011-04-20T15:33:39.397 回答