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";
}
이 동일, 즉 : –
어떤 생각이라도 어떻게이 "이슈"를 고칠 수 있습니까? –
세션 속성. 또는 요청에서 응답까지 주변을 전달할 수 있습니다. –