2017-10-10 6 views
0

私は、スプリングとタイメレフを使って簡単なフォームを作成しようとしています。これは私のコードです:モデル属性が「迷子になる」

@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リクエストと同じままです。何か不足していますか?どうすればそれを訂正できますか? dbからもう一度役割を取得するのが良い考えであるかどうかは不明です。

EDIT:

コメントからのアドバイスの後、私は(うまく動作)このような何かを思い付いた:

@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メソッドでrolesmodel.addAttribute()を呼び出す必要がありますが、どのようにオブジェクトがモデルに「自動的に注入」されます(ビューで使用できますか)。

+1

モデルのライフサイクルは、サーブレットリクエスト属性、すなわち同じである属性。 1つの要求応答サイクル。 –

+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"; 
} 
関連する問題