Форма Spring MVC: выберите тег, множественный выбор не связывается правильно?

StackOverflow https://stackoverflow.com/questions/706660

Вопрос

Я пытаюсь создать форму для редактирования существующей строки базы данных.Я использую тег формы 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;
    }
  });
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top