2015-08-28 66 views
3

在Spring MVC中處理編輯對象的正確方法是什麼?可以說我有用戶對象:在Spring MVC中處理更新表單

public class User { 
    private Integer id; 
    private String firstName; 
    private String lastName; 
    //Lets assume here are next 10 fields... 


    //getters and setters 
} 

現在在我的控制,我有GET和POST的網址:用戶/編輯/ {ID}

@RequestMapping(value = "/user/edit/{user_id}", method = RequestMethod.GET) 
public String editUser(@PathVariable Long user_id, Model model) { 
    model.addAttribute("userForm", userService.getUserByID(user_id)); 
    return "/panels/user/editUser"; 
} 


@RequestMapping(value = "/user/edit/{user_id}", method = RequestMethod.POST) 
public String editUser(@Valid @ModelAttribute("userForm") User userForm, 
      BindingResult result, @PathVariable String user_id, Model model) { 
    if(result.hasErrors()) { 
     User user = userService.getById(user_id); 
     user.updateFields(userForm); 
    } 
    userService.update(user); 
} 

現在的問題是我是否真的需要我的用戶從POST方法中的數據庫並在某種更新方法中逐一更新每個字段,或者有更好的方法嗎?

我正在考慮爲用戶使用@PathVariable,並從轉換器的數據庫中獲取用戶,然後以某種方式自動將參數從POST方法注入到該對象中。水木清華這樣的:

@RequestMapping(value = "/user/edit/{user}", method = RequestMethod.POST) 
public String editUser(@Valid @PathVariable("user") User userForm, 
    BindingResult result, Model model) 

但是當我嘗試這方面,我得到了錯誤與BindingResults:
java.lang.IllegalStateException:一個錯誤/ BindingResult參數預計模型屬性之後立即宣佈,在@RequestBody或@RequestPart參數

有沒有什麼簡單的方法來創建控制器來處理對象編輯還是我需要複製可能會逐個更改的字段?

Btw我不能使用SessionAttributes,因爲它會導致多個選項卡的問題。

+0

如果你找到一個很好的解決方案,請分享它,因爲我一直在尋找完全相同的問題。 –

回答

0

我相信你發送「userForm」作爲模型屬性。如果是用下面的模式嘗試,

@RequestMapping(value = "/user/edit/{user_id}", method = RequestMethod.POST) 
public String editUser(@PathVariable String user_id, @Valid @ModelAttribute("userForm") User userForm, 
BindingResult result, Model model) 

感謝

+0

我錯過了pathVariable的部分,但那不是重點。再次閱讀我的問題,我的問題是,我想更新對象,而不需要逐個複製每個字段.. – jgr

0

你讓用戶ID隱藏你的編輯表單內輸入。

@RequestMapping(value = "/user/edit", method = RequestMethod.POST) 
public String editUser(@Valid @ModelAttribute("userForm") User userForm, 
    BindingResult result,Model model){ 

if(result.hasErrors()){ 

    User user = userService.getById(userForm.getId()); 
    user.updateFields(userForm); 
} 
userService.update(user); 
return "redirect:......."; 
}