【问题标题】:Objects binding in Spring MVC formSpring MVC 形式的对象绑定
【发布时间】:2012-04-25 16:37:34
【问题描述】:

我正在使用 Spring MVC 开发一个测试应用程序。 我有一个Person 类和一个Group 类。每个Person 对象都引用一个Group 对象。

现在我实现了一个显示人员数据并允许编辑的 jsp。在我的表单中,我放置了一个选择控件来选择 pearson 的组:

<sf:select path="group">
    <sf:options items="${groupList}" itemLabel="name" itemValue="id" />
</sf:select>

当我加载页面时它显示了正确的组,但我无法保存更改,因为在控制器中我只得到代表组 id 的字符串。

所以,我的问题是:如何在我的控制器中获取 Group 对象而不是它的 id?

更新 这是我的控制器代码:

@RequestMapping(value = "/details", params = "save", method = RequestMethod.POST)
public String save(@ModelAttribute("person") Person p,
        BindingResult result) {
    this.personManager.savePerson(p);
    return "redirect:/people/details?id=" + p.getId();
}

【问题讨论】:

    标签: java spring spring-mvc controller


    【解决方案1】:

    通过扩展 PropertyEditorSupport 创建您自己的 GroupEditor(将正确填充组对象实例)。然后将其绑定到您的控制器中:

    @InitBinder
    protected void initBinder(WebDataBinder binder)     {
          binder.registerCustomEditor(Group.class, new GroupEditor(groupService));
    }
    

    您的实际编辑器可能看起来像这样:

    public class GroupEditor extends PropertyEditorSupport{
    
        private final GroupService groupService;
    
        public GroupEditor(GroupService groupService){
            this.groupService= groupService;
        }
    
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
          Group group = groupService.getById(Integer.parseInt(text));
          setValue(group);
        }
    }
    

    Spring docs

    【讨论】:

    • 我必须在我的方法签名中进行哪些更改?我必须这样改变public String save(@ModelAttribute("person") Person p, Group g, BindingResult result) 吗?
    • 如果它与您的原始问题相同,则没有。只有在验证绑定结果时才需要绑定结果...
    猜你喜欢
    • 2013-01-17
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多