java - 如何以一种形式传递@RequestParam 和@ModelAttribute

标签 java spring spring-mvc

我想将 @RequestParam 和 @ModelAttribute 混合在一种 Spring 形式和 Controller 中。

我在 Controller 中做的事情如下:

@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、名称、描述),但与用户没有任何联系。
所以在逻辑层面上用户和组是完全分离的。

在我的表单中,编辑用户时,有一个包含所有组的 id 的 html SELECT 元素。您可以选择多个 id 并填充用户数据并将其发送到 Controller 。

到目前为止,一切都运行良好。我正确填写了@ModelAttibute User。我还得到了填充了选定 ID(字符串)的 @RequestParam Set[String] 组。

现在我想做更多的事情。我需要写一些东西,而不是@RequestParam Set[String] 组会给我@RequestParam Set[Group] 组。当然,我可以直接在我的 Controller 方法 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 元素的 Strings 数组并将其转换为我的用户集。

我把一些括号改成了这个 [ 和 ] 因为它没有显示出来。

谢谢你的帮助。

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

我认为这是解决问题的关键。事实上,正如 javadocs 所说,只有在使用 ModelAttibute(或相同的表单支持对象......)时才需要“字段”参数,但对于 RequestParam 则不需要。那么有没有什么解决方案可以将 InitBinder 与 RequestParam 一起使用?或者我需要在 Controller 中编写一个直接方法来将 ids 转换为 Set of Group 对象?

最佳答案

尝试仅针对 Set.class 类型注册您的自定义编辑器并省略字段名称以查看是否有效。
webDataBinder.registerCustomEditor(Set.class, new CustomCol...
我怀疑字段参数表示 ModelAttribute 的属性名称,而不是请求参数名称。

或者,您可以使用包装 View 模型并使用第二个 ModelAttribute范围,

class GroupsViewModel {
    private List<Group> groups
    ...
}

关于java - 如何以一种形式传递@RequestParam 和@ModelAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11268470/

相关文章:

java - 无法在 JAXB 解码中映射字段,字段填充为 null

spring - 定制 spring 3 mvc :annotation for RequestMappingHandlerMapping

spring-mvc - Spring MVC : The request sent by the client was syntactically incorrect

java.lang.AssertionError : Content type not set - Spring Controller Junit Tests 错误

java - Jackson 使用稳定的二进制序列化吗?

java - CSV 到 H2 - 字符编码不匹配

java - EHCache JMS 复制限制线程数?

mysql - Spring MVC + Hibernate Web 应用程序。 Web 服务器因 CRUD 操作负载而挂起

java - 如何将要同步的电子邮件 ID 传递到 android 中的创建事件日历中?

java - 如何从Spring Boot连接在线MongoDB数据库?