【发布时间】:2012-07-01 09:06:45
【问题描述】:
我想将@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
}
}
有简单的用户 bean(id、firstName、lastName 等)但没有“groups”属性。 还有一个简单的 Group bean(id、name、description),但与 User 没有任何联系。 所以在逻辑层面上用户和组是完全分离的。
在我的表单中,当编辑用户时,有一个 html SELECT 元素包含所有组的 id。您可以选择多个 id 连同填充用户数据并将其发送到控制器。
到目前为止,一切运行良好。我正确填写了@ModelAttibute User。我还得到了@RequestParam Set[String] 组,其中填充了选定的 id(字符串)。
现在我想做更多的事情。我需要写一些东西,而不是@RequestParam Set[String] 组会给我@RequestParam Set[Group] 组。当然,我可以直接在我的控制器方法 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(或相同的表单支持对象......)时才是必需的,而 RequestParam 则不需要。那么有什么解决方案可以将 InitBinder 与 RequestParam 一起使用?或者我需要在控制器中编写一个将 ids 转换为 Set of Group 对象的直接方法?
【问题讨论】:
-
为什么必须是请求参数?您可以为包含用户和一组组的整个表单创建一个支持对象
标签: java spring spring-mvc