2013-07-04 55 views
0

我使用Hibernate验证与Spring MVC和我有一个问题与多选(在ManyToMany关系)。我的基类是Project。项目有(其中包括)字段:姓名(字符串),用户(多对一),区(多对多)Autopopulate多选与Hibernate验证

class Project { 
    . 
    private String name; 
    private User user; 
    private List<Region> regions 
    . 
} 

在控制器(POST行为),我有:

public String saveProject(
    @Valid Project project, 
    BindingResult bindingResult, 
    ModelMap model) { 

    //send regions, users etc. to model 

    //errors 
    if(bindingResult.hasErrors()) { 

     System.out.println(project.getRegions().size()); 
     //Printed size of regions is identical with selected 

     return "templates/project/form";   
    } 


    //no errors, save to database etc. 

} 

InitBinder:

@InitBinder 
public void initBinder (WebDataBinder binder) 
{ 
    StringTrimmerEditor stringtrimmer = new StringTrimmerEditor(true); 
    binder.registerCustomEditor(String.class, stringtrimmer); 

    binder.registerCustomEditor(List.class, "regions",new CustomCollectionEditor(List.class){ 
     @Override 
     protected Object convertElement(Object element) { 
      Region region = new Region(); 

      if (element != null) { 
       Integer id = Integer.valueOf(element.toString()); 
       region.setId(id); 
      } 
      return region; 
     } 
    }); 

在回报表格中,字段'name'id填写完毕,用户被选中,但区域多选是

更有趣的是,如果对象仍然存在于数据库中,那么在'编辑'表单中,多选是正确填写

回答

0

一个我找到了解决办法是加载区的完整的对象是“saveProject”行动:

if(bindingResult.hasErrors()) { 

    System.out.println(project.getRegions().size()); 
    //Printed size of regions is identical with selected 

    if (project.getRegions() != null) { 
     List<Region> regionsTemp = new ArrayList<Region>(); 
     for (Region region1 : project.getRegions()) { 
      Region region = Database.findById(region1.getId()); 
      regionsTemp.add(region); 
     } 
     project.setRegions(regionsTemp); 
    } 

    return "templates/project/form";   
} 

任何其他的想法?