2011-09-07 56 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,但一次只能使用一個作爲方法中的參數。