Я пытаюсь привязать один из моих объектов модели к полям формы с помощью 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?
хе! Не смотри на меня, я попробовал только потому, что это оказалось в некоторых случайных поисках Google. Весну учу методом проб и ошибок ;-)




Думаю, это должна быть упорядоченная коллекция. Например, в справочнике 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 будет ссылаться на массив. Конечно, на заказ нельзя полагаться.
Я мог бы использовать декоратор вокруг объекта модели ... похоже, хорошая идея.
Я не совсем понимаю, как именно это связано, но это работает для моих целей.
<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
Я думаю, причина того, что это не работает с Set, заключается в том, что порядок Set не гарантируется. Когда вы пытаетесь выполнить привязку к первому объекту в публикации, возможно, это был не первый объект в этом списке, который отобразился. Например, элементы [0] могут не совпадать между GET и POST.
Поэтому он должен работать нормально, если вы используете упорядоченную реализацию Set, например SortedSet или TreeSet.
Просто попробовал. SortedSet - это интерфейс, поэтому вы не можете его использовать, а TreeSet, похоже, не решает проблему.
У меня была такая же проблема, я нашел этот вопрос, изменил элемент формы на TreeSet, и он работает! Спасибо, что сэкономили мне много времени!
Вы можете попробовать написать свой собственный редактор для выполнения этой работы, а затем зарегистрировать редактор в контроллере формы. Вам не нужно было бы беспокоиться об индексировании элементов в 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));
Я неправильно прочитал вопрос в тот первый раз и не знаком с таким атрибутом пути.