2011-09-07 57 views
1

我有2种方法是通过@ModelAttribute注解返回相关对象控制器:Spring MVC的绑定错误的领域

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

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

这些对象的相互关系具有许多文件一个站点。这种关系在JPA中映射。这两个对象都包含一个名称相同的字段,称为“urlAlias”。

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

看来,任何:

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

当我提交表单到控制器,我使用下面的语法检索文档对象:此字段使用以下freemarker的标记在页面上编辑我输入到Document的urlAlias字段中的值也已在Site对象中设置,尽管我只编辑了Document对象中字段的值。

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

回答

1

这样看来,这个问题是在我的控制器中的create()方法site参数:

@ModelAttribute("site") Site site 

去除停止春季绑定到该对象的字段。对于未来的Google,我用下面的代码,而不是获取创建()方法中的Site对象的保持:

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

从这一点看来,这是很好的一个控制器来声明一个以上的ModelAttribute,但一次只能使用一个作为方法中的参数。