我正在尝试使用弹簧和百里香叶创建简单的形式。这是我的代码:
@GetMapping("users/{id}")
public String editUser(@PathVariable long id, Model model)
{
User user = userService.findByID(id);
Iterable<Role> roles= roleService.findAll();
UserEditForm userEditForm = new UserEditForm(user);
model.addAttribute("userEditForm", userEditForm);
model.addAttribute("allRoles", roles);
return "admin/userEdit";
}
@PostMapping("users/{id}")
public String updateUser(@PathVariable long id, @ModelAttribute UserEditForm userEditForm,
BindingResult bindingResult)
{
userEditValidator.validate(userEditForm, bindingResult);
if (bindingResult.hasErrors()) {
return "admin/userEdit";
}
User user = new User(userEditForm);
userService.save(user);
return "redirect:/admin/users/{id}";
}
几乎所有东西都按执行方式工作。我唯一不明白的是当表单中存在错误时缺少allRoles
modelAttribute(列表为空)(我被重定向回去纠正它们)。我认为也许模型对象被重置,但用户编辑表单与 Get 请求中相同。我错过了什么吗?如果不是,我该如何纠正它?不确定再次从数据库获取角色是否是个好主意。
编辑:
根据评论的建议,我想出了这样的东西(效果很好):
@GetMapping("users/{id}")
public String editUser(@PathVariable long id, Model model, HttpSession session)
{
User user = userService.findByID(id);
Iterable<Role> roles= roleService.findAll();
UserEditForm userEditForm = new UserEditForm(user);
model.addAttribute("userEditForm", userEditForm);
model.addAttribute("allRoles", roles);
session.setAttribute("allRoles", roles);
return "admin/userEdit";
}
@PostMapping("users/{id}")
public String updateUser(@PathVariable long id, @ModelAttribute UserEditForm userEditForm,
BindingResult bindingResult, @SessionAttribute("allRoles") Iterable<Role> roles,
Model model, SessionStatus sessionStatus)
{
userEditValidator.validate(userEditForm, bindingResult);
if (bindingResult.hasErrors()) {
model.addAttribute("allRoles", roles);
return "admin/userEdit";
}
User user = new User(userEditForm);
userService.save(user);
sessionStatus.setComplete();
return "redirect:/admin/users";
}
现在刚有一些问题。 1. 这是最好的方法吗?还是应该在需要"角色"时查询数据库?或者也许是一些不同的方法? 2. 为什么UserEditForm
对象被"自动注入"到模型中(我可以在视图中使用它),而我需要在updateUser
方法中使用roles
调用model.addAttribute()
?
根据评论的建议,我想出了这样的东西(效果很好):
@GetMapping("users/{id}")
public String editUser(@PathVariable long id, Model model, HttpSession session)
{
User user = userService.findByID(id);
Iterable<Role> roles= roleService.findAll();
UserEditForm userEditForm = new UserEditForm(user);
model.addAttribute("userEditForm", userEditForm);
model.addAttribute("allRoles", roles);
session.setAttribute("allRoles", roles);
return "admin/userEdit";
}
@PostMapping("users/{id}")
public String updateUser(@PathVariable long id, @ModelAttribute UserEditForm userEditForm,
BindingResult bindingResult, @SessionAttribute("allRoles") Iterable<Role> roles,
Model model, SessionStatus sessionStatus)
{
userEditValidator.validate(userEditForm, bindingResult);
if (bindingResult.hasErrors()) {
model.addAttribute("allRoles", roles);
return "admin/userEdit";
}
User user = new User(userEditForm);
userService.save(user);
sessionStatus.setComplete();
return "redirect:/admin/users";
}