春季"gets lost"的模型属性



我正在尝试使用弹簧和百里香叶创建简单的形式。这是我的代码:

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

最新更新