Spring绑定列表到Form:复选框

我似乎无法将我的表单绑定到复选框控件。 我在这里阅读了很多post并尝试了一些技巧但没有运气。 也许一双新鲜的眼睛会有所帮助。

我的控制器:

public String editAccount(@RequestParam("id") String id, Model model) { model.addAttribute("account", accountService.getAccount(id)); model.addAttribute("allRoles", roleService.getRoles()); return EDIT_ACCOUNT; } 

我的jsp:

 
<form:checkboxes items="${allRoles}" path="roles" itemLabel="name" itemValue="id" delimiter="
"/>

生成的html:

 

</span

我为每个循环使用了一秒(未显示)以确保模型对象包含角色。 确实如此,但是没有选中任何复选框,当我提交角色对象时总是为空。 有人可以告诉我我错过了什么吗?

谢谢

编辑

抱歉,我们意识到查看帐户和角色对象可能会有所帮助:

 public class Account { private String username, firstName, lastName, email; private List roles; @NotNull @Size(min = 1, max = 50) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @NotNull @Size(min = 1, max = 50) public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } @NotNull @Size(min = 1, max = 50) public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @NotNull @Size(min = 6, max = 50) public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public List getRoles() { return roles; } public void setRoles(List roles) { this.roles = roles; } public String toString() { return ReflectionToStringBuilder.toString(this); } } public class Role { private int id; private String name; public Role() {} public Role(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } @NotNull @Size(min = 1, max = 50) public String getName() { return name; } public void setName(String name) { this.name = name; } 

}

编辑#2

控制器发布方法

 @RequestMapping(value = "edit", method = RequestMethod.POST) public String updateAccount(@RequestParam("id") String id, @ModelAttribute("account") @Valid AccountEditForm form, BindingResult result) { System.out.println("FORM VALUES AFTER: " + form); return (result.hasErrors() ? EDIT_ACCOUNT : ACCOUNT_REDIRECT); } 

AccountEditForm是表单支持对象。 当我执行GET时,我会抓取一个Account对象,并在显示屏幕之前将值传递给AccountEditForm。 为了清楚起见,我将附上AccountEditForm。 它与帐户对象非常相似。 我刚碰巧从模型对象中分离出我的表单对象。

 public class AccountEditForm { private String username, firstName, lastName, email; private List roles = new ArrayList(); @NotNull @Size(min = 1, max = 50) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @NotNull @Size(min = 1, max = 50) public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } @NotNull @Size(min = 1, max = 50) public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @NotNull @Size(min = 6, max = 50) public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public List getRoles() { return roles; } public void setRoles(List roles) { this.roles = roles; } public String toString() { return ReflectionToStringBuilder.toString(this); } } 

编辑#3角色属性编辑器

 public class RolePropertyEditor extends PropertyEditorSupport { private Map roleMap = new HashMap(); public RolePropertyEditor(List roleList) { for (Role r : roleList) roleMap.put(r.getId(), r); } public void setAsText(String incomingId) { Role role = roleMap.get(incomingId); System.out.println("PROPERTY EDITOR ROLE " + role); setValue(role); } public String getAsText() { System.out.println("PROPERTY EDITOR ID " + ((Role)getValue()).getId()); return String.valueOf(((Role)getValue()).getId()); } } 

在我的控制器中定义如下:

 @InitBinder public void initBinder(WebDataBinder binder) { binder.setAllowedFields(new String[] { "username", "password", "confirmPassword", "firstName", "lastName", "email", "acceptTerms", "currentPassword" }); binder.registerCustomEditor(Role.class, new RolePropertyEditor(roleService.getRoles())); } 

编辑#4新ProeprtyEditor

 public class SecurityRolePropertyEditor extends PropertyEditorSupport { private RoleService roleService; public SecurityRolePropertyEditor(RoleService roleService) { this.roleService = roleService; } public void setAsText(final String name) { Role role = roleService.getRoleByName(name); setValue(role); } } 

向角色实体添加equals方法。

看到这个答案(Spring MVC Pre Populate Checkboxes) :关于更多细节的类似问题。

看来你在实体上缺少实现equalshashCode方法。