У меня есть учетная запись с отношением @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;
}
});
}