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請求屬性,即。一個請求 - 響應週期。 –
因此,任何想法如何解決這個「問題」? –
會話屬性。或者將它們從請求傳遞給響應請求。 –