0
我试图创建使用Spring和thymeleaf简单的形式“丢失”。这是我的代码:模型属性在Spring
@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}";
}
几乎一切正常exepected。我唯一不明白的地方是缺少allRoles
modelAttribute(列表为空),当表单中存在错误(并且我重定向回来纠正它们)时。我认为可能模型对象被复位,但userEditForm保持与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()
?
模型的生命周期属性是一样的servlet请求属性,即。一个请求 - 响应周期。 –
因此,任何想法如何解决这个“问题”? –
会话属性。或者将它们从请求传递给响应请求。 –