2012-06-29 85 views
3

我想在一個Spring表單和控制器中混合使用@RequestParam和@ModelAttribute。是如何在一個表單中傳遞@RequestParam和@ModelAttribute

的事情,我在我的控制器操作如下:

@RequestMapping("/user/edit/{userId}") 
public ModelAndView editUser(@PathVariable String userId, 
    @ModelAttribute User user, BindingResult bindingResult, 
    @RequestParam Set<String> groups) { 

    if(bindingResults.hasErrors() { 
     //return back to form and correct errors 
    } else { 
     //save data and get out of form 
    } 
} 

有簡單的用戶豆(ID,名字,姓氏等),但沒有「組」屬性。 還有簡單的Group bean(id,name,description),但沒有與User的任何連接。 所以在邏輯層面User和Group是完全分離的。

在我的表單中,當編輯User時,有一個html SELECT元素包含所有組的id。您可以選擇多個ID並填寫用戶數據並將其發送給控制器。

到目前爲止,一切工作都很好。我正確填寫了@ModelAttibute用戶。我也得到@RequestParam設置[字符串]組填充選定的id(字符串)。

現在我想做更多的事情。我需要寫一些而不是@RequestParam Set [String]組會給我@RequestParam設置[組]組。當然,我可以直接在我的控制器方法editUser(...)中進行轉換,但這不是一個好的解決方案。所以我決定編寫一個自定義的@InitBinder方法,它可以很好地順利地爲我做。

問題來了。

我寫的initBinder如下:

[...] 
webDataBinder.registerCustomEditor(Set.class, "groups", new CustomCollectionEditor(Set.class) { 
    @Override 
    protected Object convertElement(Object element) { 
     if (element instanceof GroupName) { 
      return element; 
     } 

     if (element instanceof String) { 
      Group group = userCatalog.loadGroup((String) element); 
      return group.getGroupName(); 
     } 

     return null; 
    } 
}); 
[...] 

的問題是,是絕對沒有辦法調用此方法。我把裏面的一些「調試」System.out.println(...),但它不打印任何東西。

我的問題是:如何編寫一個正確的InitBinder,它將響應來自HTML OPTION元素的字符串數組並將其轉換爲我的用戶組。

我改變了一些括號到這[和],因爲它沒有顯示。

謝謝你的幫助。


同時,我也遇到了這個話題:Custom property editors do not work for request parameters in Spring MVC?

,我認爲這是對解決方案的關鍵。事實上,正如javadocs所說,只有在使用ModelAttibute(或者表單支持對象是相同的...)時,「field」參數纔是必需的,但對於RequestParam而言則不是。那麼是否有任何解決方案將InitBinder與RequestParam一起使用?或者我需要在控制器中編寫一個直接方法來將ID轉換爲組對象?

+0

爲什麼它必須是一個請求PARAM?您可以爲包含用戶和組的集合的整個表單創建一個支持對象 – Affe

回答

0

嘗試註冊您的自定義編輯器只是針對Set.class類型,並忽略字段名稱,看看是否有效。

webDataBinder.registerCustomEditor(Set.class, new CustomCol...

我懷疑該字段參數表示的ModelAttribute的屬性名稱,而不是請求參數的名稱。

或者,你可以使用一個包裝視圖模型,並使用第二ModelAttribute參數,

class GroupsViewModel { 
    private List<Group> groups 
    ... 
} 
相關問題