我有一个带有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来做一些不愉快的事情?这种行为还有其他可能的原因吗?
答案 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是可以的,但一次只能使用一个作为方法中的参数。