2017-10-10 2 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에서 다시 한 번 역할을 얻는 것이 좋은 생각인지는 확실하지 않습니다.

편집 : (잘 작동) 같은 것을 함께했다

주석의 조언 후 :

@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()을 호출해야하는 동안 모델에 " UserEditForm"오브젝트가 "자동 주입"되는 이유는 무엇입니까? 서블릿 요청 속성으로 모델의 라이프 사이클 속성

@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

이 동일, 즉 : –

+0

어떤 생각이라도 어떻게이 "이슈"를 고칠 수 있습니까? –

+0

세션 속성. 또는 요청에서 응답까지 주변을 전달할 수 있습니다. –

답변

0

은 주석의 조언 후 나는 (잘 작동) 같은 것을 함께했다. 하나의 요청 - 응답주기.