Как связать атрибуты коллекции с формой в Spring MVC - PullRequest
16 голосов
/ 12 ноября 2008

Я пытаюсь привязать один из моих объектов модели к полям формы, используя 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 что-то, что работает из коробки с сетами?

Ответы [ 6 ]

5 голосов
/ 12 ноября 2008

Я думаю, это должна быть заказанная коллекция. Например, в ссылке Spring есть диаграмма , в которой говорится о том, как ссылаться на свойства. Там написано:

account [2] Указывает третий элемент индексированного свойства счета. Индексированные свойства могут иметь тип массив, список или другое естественно упорядоченный коллекция (выделение их)

Возможно, одним из подходов было бы добавить к вашему объекту метод получения, который вместо возврата вашего Set возвращает Set.toArray (). Тогда ваш атрибут items будет ссылаться на массив. Конечно, вы не можете зависеть от заказа.

3 голосов
/ 01 декабря 2008

Я думаю, что причина, по которой он не работает с множеством, заключается в том, что порядок набора не гарантирован. Когда вы пытаетесь привязать первый объект в сообщении, это может быть не первый объект в этом списке, который нужно отобразить. Например, элементы [0] могут не совпадать между GET и POST.

Так что все должно работать нормально, если вы используете упорядоченную реализацию Set, такую ​​как SortedSet или TreeSet.

2 голосов
/ 26 октября 2012

нашел идеальное решение здесь: http://forum.springsource.org/showthread.php?45312-Submitting-arrays

общая идея - использование методов commons-collection для инициализации списка:

private List someList = LazyList.decorate(new ArrayList(), FactoryUtils.instantiateFactory(com.abc.xyz.SomeClass.class));
1 голос
/ 02 декабря 2008

Вы можете попробовать написать свой собственный редактор для выполнения этой работы, а затем зарегистрировать редактор в контроллере для формы. Вам не придется беспокоиться об индексации элементов в Set таким образом. И, как упоминалось ранее, если есть способ сортировки элементов, вы можете обеспечить их порядок в наборе, используя SortedSet.

1 голос
/ 12 ноября 2008

Я не совсем ясно, как именно это связано, но это работает для моих целей.

 <c:forEach items="${items}" var="i" varStatus="itemsRow">
        <input name="items[${itemsRow.index}].fieldName" type="text"/>
    </c:forEach>
 <form:errors path="items" />
0 голосов
/ 20 апреля 2011

Вы можете использовать список, разделенный точкой с запятой, если вы используете числовые ссылки на идентификаторы объектов и зарегистрирована соответствующая реализация конвертера.

данные POST Leaderboards = 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());
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...