2016-11-01 4 views
0

사용자 관리를위한 UI를 작성하려고하는데 중요한 역할 중 하나는 사용자 역할을 변경하는 것입니다.수정 된 데이터를 얻기 위해 Thymeleaf의 확인란 목록을 바인딩 할 수 없습니다. 다시 게시되었습니다.

모델은 간단하며 사용자는 많은 역할에 속하며 역할에는 많은 사용자가 있습니다.

enter image description here

아래의 코드는 자기가 기존 사용자 편집 @Controller를 포함 제시

:

@Controller 
public class NewController { 

    final Role r1 = new Role("admin"); 
    final Role r2 = new Role("user"); 
    final Role r3 = new Role("editor"); 

    final List<Role> allRoles = Arrays.asList(r1, r2, r3); 

    final List<Role> userRoles = Arrays.asList(r3); 

    @RequestMapping(value = "/edit", method = RequestMethod.GET) 
    public ModelAndView editUser() { 

     final User user = new User(); 
     user.setEmail("[email protected]"); 
     user.setUsername("username"); 

     user.setAuthorities(userRoles); 

     final ModelAndView mav = new ModelAndView("edit"); 

     allRoles.stream() 
       .filter(r-> user.getAuthorities().contains(r)) 
       .forEach(r -> r.setChecked(true)); 

     mav.addObject("roles", allRoles); 
     mav.addObject("user", user); 
     return mav; 
    } 

    @RequestMapping(value = "/edit", method = RequestMethod.POST) 
    public ModelAndView updateUser(
      @ModelAttribute("user") User user, 
      @ModelAttribute("roles") ArrayList<Role> roles, 
      ModelMap model) { 

     final List<Role> newRoles = roles.stream() 
       .filter(r -> r.isChecked() != null) 
       .filter(r -> r.isChecked() == true) 
       .collect(Collectors.toList()); 

     user.setAuthorities(newRoles); 

     return new ModelAndView("redirect:/edit"); 
    } 
} 

을 그리고 내가 사용자 편집 할 수있어 내 스프링 Thymeleaf 페이지의 :

<form th:action="'/edit'" method="POST" enctype="utf8"> 

    <div class="form-group row"> 
     <label class="col-sm-3" th:text="#{label.user.id}">Id</label> 
     <span class="col-sm-5" th:text="${user.id}">id</span> 
    </div> 

    <div class="form-group row"> 
     <label class="col-sm-3" th:text="#{label.user.username}">Username</label> 
     <input class="form-control" name="username" th:value="${user.username}" required="required"/></span> 
    </div> 

    <div class="form-group row"> 
     <label class="col-sm-3" th:text="#{label.user.email}">email</label> 
     <input type="email" class="form-control" name="email" th:value="${user.email}" 
       required="required"/></span> 
    </div> 

    <div class="form-group row"> 
     <label class="col-sm-3" th:text="#{label.user.password}">password</label> 
     <input id="password" class="form-control" name="password" value="" 
       type="password"/></span> 
    </div> 

    <div class="form-group row"> 
     <label class="col-sm-3" th:text="#{label.user.confirmPass}">confirm</label> 
     <input id="matchPassword" class="form-control" name="matchingPassword" value="" 
       type="password"/></span> 
    </div> 

    <div th:each="item, index : ${roles}"> 
     <input type="checkbox" 
       th:text="${item.authority}" 
       name="${item.authority}" 
       th:checked="${item.checked}" /> 
    </div> 

    <button type="submit" class="btn btn-primary" th:text="#{label.edit.save}">save</button> 
</form> 

'저장'버튼을 클릭하면 updateUser 메소드가 실행되지만 ArrayList roles은 비어 있습니다. 사용자 모델에 대한 다른 값이 올바르게 전달되고 사용자 이름/전자 메일/암호를 문제없이 변경할 수 있으므로 사용자 bean이 올바르게 채워집니다.

답변

0

좋아, 그것을 다르게 해결 : 양식을 제출할 때

<th:block th:each="role : ${roles}"> 
    <input type="checkbox" 
      name="newRoles" 
      th:checked="${role.checked}" 
      th:value="${role.id}"/> 
    <label th:text="${role.authority}"></label> 
</th:block> 

그래서, 당신은 newRoles RequestParam 내 역할 ID의 목록을 얻고, : 체크 박스 처리와 HTML 페이지의

조각이 있어야한다 내 POST 컨트롤러입니다.

@RequestMapping(value = "https://stackoverflow.com/users/{id}/edit", method = RequestMethod.POST) 
public ModelAndView updateUser(
     @ModelAttribute("user") User user, 
     @RequestParam(value = "newRoles") ArrayList<Long> roles, 
     BindingResult bindingResult , Model model) { 

    final List<Role> newRoles = 
      roles.stream() 
       .map(id -> roleService.findOne(id)) 
       .collect(Collectors.toList()); 
    user.setAuthorities(newRoles); 

    userService.update(user); 

    return new ModelAndView("redirect:/users"); 
}