2017-10-10 44 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"; 
}