Spring MVC绑定到错误的字段

时间:2011-09-07 17:14:50

标签: java spring spring-mvc

我有一个带有2个方法的控制器,通过@ModelAttribute注释返回相关对象:

@ModelAttribute("site")
public Site getSite(){
.....
return site;
}

@ModelAttribute("document")
public Document getDocument(){
.....
return document;
}

这些对象彼此相关,其中一个站点有许多文档。此关系在JPA中映射。这两个对象都包含一个名称相同的字段,称为“urlAlias”。使用以下freemarker标记在页面上编辑此字段:

<@spring.bind "document" />
....
<@spring.formInput "document.urlAlias" />

当我将表单提交给控制器时,我使用以下语法检索文档对象:

@RequestMapping(method = RequestMethod.POST)
    public ModelAndView create(@ModelAttribute("document") @Valid Document document, BindingResult documentResult,
            @ModelAttribute("site") Site site, Model model){
...Do Stuff...
}

看来我在Document的urlAlias字段中输入的任何值也已在Site对象中设置,即使我只编辑了Document对象中字段的值。

我很困惑这里发生了什么。我是否通过在同一个控制器中映射多个ModelAttribute来做一些不愉快的事情?这种行为还有其他可能的原因吗?

1 个答案:

答案 0 :(得分:1)

问题似乎是我控制器中create()方法中的site参数:

@ModelAttribute("site") Site site

删除它会阻止Spring绑定到该对象中的字段。对于未来的googlers,我使用下面的代码在create()方法中获取Site对象:

if (!model.containsAttribute("site")) {
    throw new IllegalArgumentException("Model must contain site attribute.");
}
Site site = (Site) model.asMap().get("site"); 

由此可以看出,在控制器中声明多个ModelAttribute是可以的,但一次只能使用一个作为方法中的参数。