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

Я пытаюсь создать форму для редактирования существующей строки базы данных. Я использую тег формы Spring MVC для автоматической привязки html к объекту поддержки формы. Строка имеет отношение «многие ко многим» с другой таблицей, которую я пытаюсь представить с помощью поля множественного выбора, используя тег form:select;

<form:select path="rules">
    <form:options items="${bundle.rules}" itemValue="name" itemLabel="name"/>
</form:select>

Я использую Hibernate для постоянства, поэтому отношения представляются как HashSet внутри Bundle pojo.

 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, что похоже на этот вопрос, к сожалению, ни одно из предложений не оказалось полезным для моей проблемы.


person James McMahon    schedule 01.04.2009    source источник
comment
Похоже, часть вашего сообщения об ошибке была обрезана. У вас есть еще ошибка? Трассировка стека?   -  person Jacob Mattison    schedule 02.04.2009
comment
Ну, по какой-то причине его сообщение находится на уровне отладки. На самом деле это не исключение. Я неправильно написал, когда упомянул трассировку стека, сейчас исправлю.   -  person James McMahon    schedule 02.04.2009


Ответы (1)


Проблема с отправкой формы. 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;
    }
  });
}
person kgiannakakis    schedule 07.04.2009
comment
Спасибо, к сожалению, я не могу получить Wordpress с работы. Если вы можете опубликовать более подробную информацию, я был бы признателен. - person James McMahon; 07.04.2009
comment
Это то, что мне нужно было сделать. Как только я реализовал ваш фрагмент кода, все заработало. Можете ли вы порекомендовать хороший источник обучения для Spring MVC? Я читал документацию/учебники на SpringSource.org и купил книгу Spring In Action, но ни в одной из них нет той глубины, которая мне нужна. - person James McMahon; 07.04.2009