Bonjour à tous, voici un problème sur lequel je suis coincé.
Contexte : j'ai une table Roles et une table Privileges (un role possède des provileges)
Lors de l'édition d'un role, j'ai un input:select multiple qui permet selectionnez plusieurs plusieurs privileges, mais malheureuement, j'ai des problemes lors de l'enregistrement.
Voci ma Classe Role
Ma classe Privilege:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 @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*/ }
et voici mon controller qui s'occupe du traitement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 @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*/
Voici le debug qui en ressort :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 @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"; }
voila, je ne comprends pas pouquoi, mon roles.getPrivileges est un Set de Set,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 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
et sa class est java.util.LinkedHashSet au lieu de Privilege.
Du coup, ca plante plus loin.
Des idées et conseils sont les bienvenus.
Partager