2015-08-28 117 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:......."; 
}