2012-06-29 46 views
3

我想在一个Spring表单和控制器中混合使用@RequestParam和@ModelAttribute。是如何在一个表单中传递@RequestParam和@ModelAttribute

的事情,我在我的控制器操作如下:

@RequestMapping("/user/edit/{userId}") 
public ModelAndView editUser(@PathVariable String userId, 
    @ModelAttribute User user, BindingResult bindingResult, 
    @RequestParam Set<String> groups) { 

    if(bindingResults.hasErrors() { 
     //return back to form and correct errors 
    } else { 
     //save data and get out of form 
    } 
} 

有简单的用户豆(ID,名字,姓氏等),但没有“组”属性。 还有简单的Group bean(id,name,description),但没有与User的任何连接。 所以在逻辑层面User和Group是完全分离的。

在我的表单中,当编辑User时,有一个html SELECT元素包含所有组的id。您可以选择多个ID并填写用户数据并将其发送给控制器。

到目前为止,一切工作都很好。我正确填写了@ModelAttibute用户。我也得到@RequestParam设置[字符串]组填充选定的id(字符串)。

现在我想做更多的事情。我需要写一些而不是@RequestParam Set [String]组会给我@RequestParam设置[组]组。当然,我可以直接在我的控制器方法editUser(...)中进行转换,但这不是一个好的解决方案。所以我决定编写一个自定义的@InitBinder方法,它可以很好地顺利地为我做。

问题来了。

我写的initBinder如下:

[...] 
webDataBinder.registerCustomEditor(Set.class, "groups", new CustomCollectionEditor(Set.class) { 
    @Override 
    protected Object convertElement(Object element) { 
     if (element instanceof GroupName) { 
      return element; 
     } 

     if (element instanceof String) { 
      Group group = userCatalog.loadGroup((String) element); 
      return group.getGroupName(); 
     } 

     return null; 
    } 
}); 
[...] 

的问题是,是绝对没有办法调用此方法。我把里面的一些“调试”System.out.println(...),但它不打印任何东西。

我的问题是:如何编写一个正确的InitBinder,它将响应来自HTML OPTION元素的字符串数组并将其转换为我的用户组。

我改变了一些括号到这[和],因为它没有显示。

谢谢你的帮助。


同时,我也遇到了这个话题:Custom property editors do not work for request parameters in Spring MVC?

,我认为这是对解决方案的关键。事实上,正如javadocs所说,只有在使用ModelAttibute(或者表单支持对象是相同的...)时,“field”参数才是必需的,但对于RequestParam而言则不是。那么是否有任何解决方案将InitBinder与RequestParam一起使用?或者我需要在控制器中编写一个直接方法来将ID转换为组对象?

+0

为什么它必须是一个请求PARAM?您可以为包含用户和组的集合的整个表单创建一个支持对象 – Affe

回答

0

尝试注册您的自定义编辑器只是针对Set.class类型,并忽略字段名称,看看是否有效。

webDataBinder.registerCustomEditor(Set.class, new CustomCol...

我怀疑该字段参数表示的ModelAttribute的属性名称,而不是请求参数的名称。

或者,你可以使用一个包装视图模型,并使用第二ModelAttribute参数,

class GroupsViewModel { 
    private List<Group> groups 
    ... 
} 
相关问题