• Problems with WebDataBinder and Set.Class


    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. 

  • 相关阅读:
    【Android 7.1.1】 锁屏界面点击“空白处”响应事件
    ubuntu14.04 LTS Visual Studio Code 编辑器推荐
    使用MAT分析Java内存
    Android 性能优化:使用 Lint 优化代码、去除多余资源
    Android 内存使用hprof文件打开方法
    使用Android Studio调试内存问题
    使用新版Android Studio检测内存泄露和性能
    Android性能优化篇 [ 谷歌官方 ]
    Android 内存泄露总结(附内存检测工具)
    Android MemInfo 各项的意义(转)
  • 原文地址:https://www.cnblogs.com/chenying99/p/2392711.html
Copyright © 2020-2023  润新知