Как привязать атрибуты коллекции к форме в Spring MVC

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

Я неправильно прочитал вопрос в тот первый раз и не знаком с таким атрибутом пути.

zmf 12.11.2008 19:19

хе! Не смотри на меня, я попробовал только потому, что это оказалось в некоторых случайных поисках Google. Весну учу методом проб и ошибок ;-)

agnul 12.11.2008 19:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
2
36 162
6

Ответы 6

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

account[2] Indicates the third element of the indexed property account. Indexed properties can be of type array, list or other naturally ordered collection (emphasis theirs)

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

Я мог бы использовать декоратор вокруг объекта модели ... похоже, хорошая идея.

agnul 13.11.2008 11:05

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

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

Причина такого поведения объясняется здесь: viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list

Alex 22.10.2013 23:44

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

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

Просто попробовал. SortedSet - это интерфейс, поэтому вы не можете его использовать, а TreeSet, похоже, не решает проблему.

James McMahon 01.04.2009 21:29

У меня была такая же проблема, я нашел этот вопрос, изменил элемент формы на TreeSet, и он работает! Спасибо, что сэкономили мне много времени!

nont 10.09.2009 21:24

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

Вы можете использовать список, разделенный точкой с запятой, если вы используете числовые ссылки на идентификаторы объектов и соответствующую зарегистрированную реализацию 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());
        }

}

нашел идеальное решение здесь: 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));

Другие вопросы по теме