我想在一个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转换为组对象?
为什么它必须是一个请求PARAM?您可以为包含用户和组的集合的整个表单创建一个支持对象 – Affe