i am having trouble with binding my data from a form : I have two class
@Entity @Table(name = "ROLES") public class Role implements GenericDomain { private Long id; private String code; private String name; private Set<Privilege> privileges = new HashSet<Privilege>(0); public Role() {} /* getter and setter*/ @ManyToMany(cascade=CascadeType.ALL) @JoinTable(name = "ROLES_PRIVILEGES" , joinColumns = { @JoinColumn(name = "ROLE_ID") } , inverseJoinColumns = { @JoinColumn(name = "PRIVILEGE_ID") } ) public Set<Privilege> getPrivileges() { return this.privileges; } public void setPrivileges(Set<Privilege> privileges) { this.privileges = privileges; } /* overide of hascode, equals*/ }
And
@Entity @Table(name = "PRIVILEGES") public class Privilege implements GenericDomain { private Long id; private String code; private Set<Role> roles = new HashSet<Role>(0); public Privilege() {} /* getter and setter*/ @ManyToMany(cascade=CascadeType.REFRESH, mappedBy="privileges") public Set<Role> getRoles() { return this.roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } @Override public String toString(){ return this.getCode() + this.getComment(); } /*overide equals and hascode*/
and in my controller i have :
@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Set.class, "privileges", new CustomCollectionEditor(Set.class) { @Override protected Object convertElement(Object element) { return (element == null)?null:privilegeService.getOne(Integer.parseInt((String)element)); } }); } @RequestMapping(value = "edit", method = RequestMethod.POST) public String saveOldRole( @ModelAttribute("role") Role role , BindingResult result , ModelMap model ) { validator.validate(role, result); if (result.hasErrors()){ logger.error(result.getAllErrors()); model.addAllAttributes(result.getModel()); return "/admin/role/edit"; } logger.info(role.getPrivileges()); Iterator p = role.getPrivileges().iterator(); while(p.hasNext()){ logger.info(p.next().getClass()); } roleService.saveOrUpdate(role); model.addAttribute("roles", roleService.getAll()); sessionStatus.setComplete(); return "redirect:/admin/role/list.do"; }
and my debug is
role.RoleController:93 - [[MANAGE_USERS], [MANAGE_ROLES]] role.RoleController:96 - class java.util.LinkedHashSet role.RoleController:96 - class java.util.LinkedHashSet 22:29:44,915 ERROR tomcat-http--7 property.BasicPropertyAccessor:194 - IllegalArgumentException in class: com.stunaz.domain.Privilege, getter method of property: id
I dont understand why at 96, the class type is java.util.LinkedHashSet
, i thought it should be Privileges. I dont understand why my role.getPrivileges()
is a Set of Set, it should be a Set of Privilege.
Of course at saveOrUpdate
am getting an error.
finaly!!! there were no bug at all! i updated my spring jar from 3.0.5.RELEASE to 3.1.0.M1, and voila : somthing stopped working with webdatabinder and CustomCollectionEditor.
i just rollback to 3.0.5.RELEASE and everything is fine.