Spring MVC форма: выберите тег, несколько вариантов выбора не связываются правильно? - PullRequest
6 голосов
/ 01 апреля 2009

Я пытаюсь создать форму для редактирования существующей строки базы данных. Я использую тег формы Spring MVC, чтобы автоматически связать HTML с объектом поддержки формы. Строка имеет отношение многие ко многим с другой таблицей, которую я пытаюсь представить в поле множественного выбора, используя форму: тег 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 , что похоже на этот вопрос, к сожалению, ни одно из предложений не показалось полезным для моей проблемы.

1 Ответ

8 голосов
/ 07 апреля 2009

Проблема с представлением вашей формы. 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;
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...