Форма Spring MVC: выберите тег, множественный выбор не связывается правильно?
-
22-08-2019 - |
Вопрос
Я пытаюсь создать форму для редактирования существующей строки базы данных.Я использую тег формы Spring MVC для автоматической привязки HTML к объекту поддержки формы.Строка имеет связь многие-ко-многим с другой таблицей, которую я пытаюсь представить с помощью поля множественного выбора, используя тег form:select;
<form:select path="rules">
<form:options items="${bundle.rules}" itemValue="name" itemLabel="name"/>
</form:select>
Я использую Hibernate для сохранения, поэтому отношения представляются как HashSet внутри Pojo Bundle.
private Set<Rule> rules = new HashSet<Rule>(0);
Без поля выбора на странице объект будет корректно обновляться в базе данных, однако с полем выбора объект не будет обновляться в базе данных, и я получаю эту ошибку в своем журнале log4j. Обратите внимание, что эта ошибка не вызывает исключения. , это видно только в журналах;
DEBUG org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:256) - Data binding errors: 1
Это происходит независимо от того, когда я отменяю выбор элементов внутри поля выбора, вся форма отказывается отправляться правильно.Может кто-нибудь мне помочь?
я знаю Как привязать атрибуты коллекции к форме в Spring MVC, что похоже на этот вопрос, к сожалению, ни одно из предложений не показалось полезным для моей проблемы.
Решение
Проблема в отправке вашей формы.Spring не может связать объект команды, поэтому он не отправляет форму, а вместо этого перенаправляет вас в formView.
Когда привязка будет успешно выполнена, вместо этого вы увидите следующее сообщение:
No errors -> processing submit
Чтобы решить вашу проблему, вам необходимо зарегистрировать CustomCollectionEditor на вашем контроллере.(Видеть это связь).Это было бы примерно так:
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception
{
binder.registerCustomEditor(Set.class, "rules", new CustomCollectionEditor(Set.class)
{
protected Object convertElement(Object element)
{
String name = "";
if (element instanceof String)
name = (String) element;
return name != null ? new Rule(name) : null;
}
});
}