我想在一個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轉換爲組對象?
爲什麼它必須是一個請求PARAM?您可以爲包含用戶和組的集合的整個表單創建一個支持對象 – Affe