我有一个包含10多个字段输入的表单,将由用户更新。在提交时,我需要更新对象(通过id)和在表单中修改的任何/所有字段(使用Spring Data JPA& Repositories)。我相信我可以通过将@ModelAttribute
作为与我的对象相关联的方法参数传递来做到这一点,但我还没有完全理解这一点。这是我的控制器
@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("User") User user, @PathVariable Long id, Model model) {
user = userRepo.findOne(id); //Spring Repository method to find user by ID
// Here is where you'd set all fields of the User object including those modified in the form
model.addAttribute("user", user);
userRepo.save(user); //Updates user in database
return "success";
}
我正在寻找一种与以下内容完全相同的方法:
user.setName(user.getName());
user.setAddress(user.getAddress));
//etc.
不显式调用每个set方法(字段输入的数量将增加)。
感谢队友
答案 0 :(得分:1)
如果你有一个表单并且你正在使用ModelAndAttribute,你只需要设置要发送给Controller的id属性
<form:input id="id" path="id"/>
<form:input id="name" path="name"/>
<form:input id="address" path="address"/>
然后在你的控制器中,你只需要做你正在做的事情
@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("User") User user, @PathVariable Long id, Model model) {
user = userRepo.findOne(id); //Spring Repository method to find user by ID
// Here is where you'd set all fields of the User object including those modified in the form
model.addAttribute("user", user);
userRepo.save(user); //Updates user in database
return "success";
}
但是,如果您正在通过Ajax执行此请求,则需要再次加载实体User以使用新Id在表单中设置新实体。 您可以查看JQuery加载以再次加载表单元素。
或者,如果保存是通过HTTP Request完成的,则必须在保存后刷新页面,因此您需要再次返回ModelAndView,实体用户已经使用id更新
@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("User") User user, @PathVariable Long id, Model model) {
user = userRepo.findOne(id); //Spring Repository method to find user by ID
userRepo.save(user); //Updates user in database
ModelAndView mav = new ModelAndView(yourview);
mav.setObject("user", user);
return mav;
}