Spring MVC 3: добавление формы для отношений ManyToMany не вызывает исключения BindingResult - PullRequest
0 голосов
/ 21 июня 2011

У меня есть учетная запись с отношением @ManyToMany к ролевой организации. (Таким образом, я могу иметь учетную запись с несколькими ролями).

В моем Account.java (Entity) я определил отношения следующим образом:

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "Account_Role", joinColumns = { 
@JoinColumn(name = "Account_id") }, 
inverseJoinColumns = { @JoinColumn(name = "Role_id") })
private List<Role> roles = new ArrayList<Role>(0);

В моем AccountController у меня есть следующие действия для GET и POST:

@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(Account item, BindingResult bindingResult, Model model, HttpServletRequest request) 
{       
  accountService.save(item);
  return "redirect:/account/list";
}

@RequestMapping(value="/add", method=RequestMethod.GET)
public String addForm(Model model) {
  model.addAttribute("item", new Account());
  model.addAttribute("roleList", roleService.list());

return "account/add";
}

Мой вид формы add.jsp выглядит так:

<form method="post">
<table>
    .....

    <tr>
        <td style="width:75px">
            <label for="roles"><spring:message code="labels.account.form.roles" text="Roles" /></label>
        </td>
        <td>
            <form:select path="roles" multiple="true" items="${roleList}" itemLabel="name" itemValue="id"/>
        </td>
    </tr>
    <tr>
        <td></td>
        <td>
            <input id="submitbutton" type="submit" value="<spring:message code="labels.form.button.add" text="Save" />" style="width:100%;">
        </td>
    </tr>
</table>

Когда я пытаюсь открыть диалог добавления для входа в новую учетную запись, я всегда получаю следующую ошибку:

SEVERE: Servlet.service() for servlet [spring] in context with path [/eLearning] threw exception [Request processing failed; nested exception is org.apache.tiles.impl.CannotRenderException: ServletException including path '/WEB-INF/views/template/layout.jsp'.] with root cause
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'roles' available as request attribute

Я был бы очень признателен за помощь. У меня нет проблем с доступом к другим полям Атрибута Entity. Это просто «роли» - атрибут, который вызывает проблемы. Потому что, если я закомментирую это из формы add jsp, тогда все будет нормально: S.

Спасибо за вашу помощь.

EDIT:

Спасибо за вашу помощь. Я больше не получаю исключения. Как я могу теперь получить доступ к значению ролей? Если я пытаюсь получить доступ к item.getRoles () в контроллере, я получаю пустой список. Как мне сделать так, чтобы роли, выбранные в списке выбора, сохранялись в списке ролей в учетной записи?

РЕШЕНИЕ ВТОРОЙ ПРОБЛЕМЫ:

Необходимо добавить пользовательское связующее в контроллер:

@InitBinder
protected void initBinder(WebDataBinder binder) throws Exception {
    binder.registerCustomEditor(Set.class, "roles", new CustomCollectionEditor(Set.class) {
        protected Object convertElement(Object element) {
            if (element instanceof Role) {
                return element;
            }
            if (element instanceof String) {
                return roleService.load(Long.valueOf(element.toString()));
            }
            return null;
        }
    });
}

Ответы [ 2 ]

1 голос
/ 21 июня 2011

roles является свойством Account, поэтому вам необходимо привязать форму к атрибуту модели типа Account, чтобы изменить его свойства:

<form:form method="post" modelAttribute = "item">...</form:form>

Также обратите внимание, что если атрибут моделиимя (item в вашем случае) отличается от имени своего класса (account), вам нужно явно указать имя атрибута:

public String add(@ModelAttribute("item") Account item, BindingResult bindingResult, Model model, HttpServletRequest request)   { ... }
0 голосов
/ 21 июня 2011

Для использования <form:select вам нужно <form:form modelAttribute="account">

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...