2017-10-10 74 views
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對象被「自動注入」模式(我可以在視圖中使用它),而我需要updateUserroles調用model.addAttribute()

+1

模型的生命週期屬性是一樣的servlet請求屬性,即。一個請求 - 響應週期。 –

+0

因此,任何想法如何解決這個「問題」? –

+0

會話屬性。或者將它們從請求傳遞給響應請求。 –

回答

0

從評論的意見後,我想出了這樣的事情(效果很好):

@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"; 
}