2011-08-08 33 views
5

Thông tin cơ bản nhỏ đầu tiên. Có một mối quan hệ vai trò người dùng khá chuẩn, trong đó Người dùng có thể có nhiều vai trò. Tôi có các vai trò được định nghĩa là một bộ trong lớp người dùng. Bây giờ tôi biết rằng các hình thức html có tất cả các giá trị như chuỗi và cố gắng để có được các giá trị như đối tượng vai trò tùy chỉnh của tôi không hoạt động. Tôi đã thực hiện một initbinder để chuyển đổi của id trở lại thành đối tượng để tôi có thể lấy ra các giá trị đã chọn ngoài các hộp kiểm của tôi, phần đó hoạt động.Spring MVC Pre Populate Checkboxes

Nhưng tôi dường như không thể quay lại theo cách khác. Tôi lấy một người dùng từ cơ sở dữ liệu đã có vai trò và muốn điền trước các hộp kiểm vai trò với tất cả các vai trò mà người dùng có. Dựa trên ví dụ này:

Checkboxes example

Họ nói rằng:

dạng: hộp kiểm mục = "$ {động-list}" path = "Tài sản-to-store"

Đối với nhiều hộp kiểm, miễn là giá trị "đường dẫn" hoặc "thuộc tính" là bằng bất kỳ giá trị "hộp kiểm nào - $ {dynamic-list}", hộp kiểm phù hợp sẽ tự động được kiểm tra.

Giải thích của tôi về điều đó là tôi có thể cấp cho nó một tập hợp tất cả các vai trò và xác định đường dẫn là vai trò từ đối tượng người dùng và nó phải khớp với chúng để khiến hộp kiểm được điền trước.

Mỗi ví dụ có vẻ như có giá trị của danh sách động dưới dạng Chuỗi []. Vâng thats tuyệt vời và dandy nhưng làm thế nào để làm việc này cho các đối tượng tùy chỉnh mà chúng tôi định nghĩa là một Set? Tôi vẫn có thể sử dụng định nghĩa một dòng này cho các hộp kiểm hay tôi có cần phải thực hiện một số loại ràng buộc dữ liệu nào đó trong chế độ xem không?

Đây là người dùng dto, bộ điều khiển người dùng, biểu mẫu tùy chỉnh của tôi và trang chỉnh sửa người dùng.

tài DTO

@Entity 
@Table 
public class User extends BaseDto 
{ 
    @Column(updatable = false) @NotBlank 
    private String username; 

    @Column(name = "encrypted_password") @Size(min = 6, message = "password must be at least 6 characters") @Pattern(regexp = "^\\S*$", message = "invalid character detected") 
    private String password; 

    @Column(name = "first_name") 
    private String firstName; 

    @Column(name = "last_name") 
    private String lastName; 

    @Column @NotNull 
    private boolean enabled; 

    @Column @Email @NotBlank 
    private String email; 

    @Transient 
    private String confirmPassword; 

    @ManyToMany(targetEntity = Role.class, fetch = FetchType.EAGER, cascade = CascadeType.REFRESH) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "role_id")) 
    private Set<Role> roles; 

    public User() 
    { 
    } 

    public User(final String usernameIn, final String passwordIn, final String firstNameIn, final String lastNameIn, final String emailIn, final boolean enabledIn) 
    { 
     username = usernameIn; 
     password = passwordIn; 
     firstName = firstNameIn; 
     lastName = lastNameIn; 
     email = emailIn; 
     enabled = enabledIn; 
    } 

    public String getUsername() 
    { 
     return username; 
    } 

    public void setUsername(final String usernameIn) 
    { 
     username = usernameIn; 
    } 

    public String getPassword() 
    { 
     return password; 
    } 

    public void setPassword(final String passwordIn) 
    { 
     password = passwordIn; 
    } 

    public String getFirstName() 
    { 
     return firstName; 
    } 

    public void setFirstName(final String firstNameIn) 
    { 
     firstName = firstNameIn; 
    } 

    public String getLastName() 
    { 
     return lastName; 
    } 

    public void setLastName(final String lastNameIn) 
    { 
     lastName = lastNameIn; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public void setEmail(final String emailIn) 
    { 
     email = emailIn; 
    } 

    public String getConfirmPassword() 
    { 
     return confirmPassword; 
    } 

    public void setConfirmPassword(final String confirmPasswordIn) 
    { 
     confirmPassword = confirmPasswordIn; 
    } 

    public boolean isEnabled() 
    { 
     return enabled; 
    } 

    public void setEnabled(final boolean enabledIn) 
    { 
     enabled = enabledIn; 
    } 

    public Set<Role> getRoles() 
    { 
     return roles; 
    } 

    public void setRoles(final Set<Role> rolesIn) 
    { 
     roles = rolesIn; 
    } 
} 

tài điều khiển

@Controller @RequestMapping("/user") 
public class UserController 
{ 
    @Autowired private UserService userService; 
    @Autowired private UserDao userDao; 
    @Autowired private RoleDao roleDao; 

    @InitBinder 
    public void bindForm(final WebDataBinder binder) 
    { 
     binder.registerCustomEditor(Set.class, "roles", new CustomFormBinder<RoleDao>(roleDao, Set.class)); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public String index(final ModelMap modelMap) 
    { 
     return "/user/index"; 
    } 

    @RequestMapping(value = "/create", method = RequestMethod.GET) 
    public String create(final ModelMap modelMap) 
    { 
     modelMap.addAttribute("userInstance", new User()); 
     modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll())); 

     return "/user/create"; 
    } 

    @RequestMapping(value = "/save", method = RequestMethod.POST) 
    public String save(final ModelMap modelMap, @Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult) 
    { 
     // TODO move to service validation 
     if (user.getPassword() == null || !user.getPassword().equals(user.getConfirmPassword())) 
     { 
     bindingResult.addError(new FieldError("userInstance", "password", "password fields must match")); 
     bindingResult.addError(new FieldError("userInstance", "confirmPassword", "password fields must match")); 
     } 
     if (user.getRoles() == null || user.getRoles().isEmpty()) 
     { 
     bindingResult.addError(new FieldError("userInstance", "roles", "Must select at least one role for a User")); 
     } 
     if (bindingResult.hasErrors()) 
     { 
     modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll())); 
     return "/user/create"; 
     } 

     userService.save(user); 
     return "redirect:/user/list"; 
    } 

    @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET) 
    public String edit(@PathVariable final Integer id, final ModelMap modelMap) 
    { 
     final User user = userDao.find(id); 

     if (user != null) 
     { 
     modelMap.addAttribute("userInstance", user); 
     modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll())); 
     return "/user/edit"; 
     } 
     return "redirect:/user/list"; 
    } 

    @RequestMapping(value = "/edit", method = RequestMethod.GET) 
    public String editCurrent(final ModelMap modelMap) 
    { 
     return edit(userService.getLoggedInUser().getId(), modelMap); 
    } 

    @RequestMapping(value = "/update", method = RequestMethod.POST) 
    public String update(@Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult) 
    { 
     if (bindingResult.hasErrors()) 
     { 
     return "/user/edit"; 
     } 

     userService.save(user); 
     return "redirect:/user/list"; 
    } 

    @ModelAttribute("userInstances") 
    @RequestMapping(value = "/list", method = RequestMethod.GET) 
    public List<User> list() 
    { 
     return userDao.findAll(); 
    } 
} 

Tuỳ chỉnh Mẫu Binder

public class CustomFormBinder<T extends GenericDao> extends CustomCollectionEditor 
{ 
    private final T dao; 

    private static final Logger LOG = LoggerFactory.getLogger(CustomFormBinder.class); 

    public CustomFormBinder(final T daoIn, final Class collectionType) 
    { 
     super(collectionType, true); 
     dao = daoIn; 
    } 

    @Override 
    protected Object convertElement(final Object element) 
    { 
     try 
     { 
     // forms should return the id as the itemValue 
     return dao.find(Integer.valueOf(element.toString())); 
     } 
     catch (NumberFormatException e) 
     { 
     LOG.warn("Unable to convert " + element + " to an integer"); 
     return null; 
     } 
    } 

} 

tài khoản Chỉnh sửa Xem

<html> 
    <head> 
     <title>Create User</title> 
    </head> 
    <body> 

    <c:url value="/user/update" var="actionUrl"/> 
    <form:form method="post" commandName="userInstance" action="${actionUrl}"> 
     <h1>Edit User ${userInstance.username}</h1> 

     <div> 
      <form:label path="username">Username:</form:label> 
      <form:input path="username" id="username" readonly="true"/> 
     </div> 

     <div> 
      <form:label path="password">Password:</form:label> 
      <form:input path="password" id="password" type="password" readonly="true"/> 
      <tag:errorlist path="userInstance.password" cssClass="formError"/> 
     </div> 

     <div> 
      <form:label path="firstName">First Name:</form:label> 
      <form:input path="firstName" id="firstName"/> 
      <tag:errorlist path="userInstance.firstName" cssClass="formError"/> 
     </div> 

     <div> 
      <form:label path="lastName">Last Name:</form:label> 
      <form:input path="lastName" id="lastName"/> 
      <tag:errorlist path="userInstance.lastName" cssClass="formError"/> 
     </div> 

     <div> 
      <form:label path="email">Email:</form:label> 
      <form:input path="email" id="email" size="30"/> 
      <tag:errorlist path="userInstance.email" cssClass="formError"/> 
     </div> 

     <div> 
     **<%--Want to Pre Populate these checkboxed--%> 
<form:checkboxes title="Assigned Roles:" path="roles" id="roles" items="${validRoles}" itemLabel="displayName" itemValue="id" element="div"/>** 
      <tag:errorlist path="userInstance.roles" cssClass="formError"/> 
     </div> 

     <form:hidden path="enabled"/> 
     <form:hidden path="id"/> 
     <form:hidden path="version"/> 

     <div class="submit"> 
      <input type="submit" value="Update"/> 
      <a href="<c:url value='/user/list'/>" class="cancel">Cancel</a> 
     </div> 
    </form:form> 

    </body> 
    </html> 
+0

Lưu ý rằng '

Chỉnh sửa người dùng $ {userInstance.username}

' dường như làm cho việc chèn tập lệnh java có thể là – Ralph

Trả lời

5

Bạn cần phương thức equals được thực hiện đúng cho Role!

Nếu điều này là chưa đủ, hãy xem lớp oorg.springframework.web.servlet.tags.form.AbstractCheckedElementTag. Phương thức void renderFromValue(Object item, Object value, TagWriter tagWriter) là nơi cờ được chọn được đặt.

+1

Phương thức equals đã thực hiện thủ thuật !! Tôi không chắc mình có bao giờ nghĩ đến việc đó. CẢM ƠN!! – sauce

+0

@Ralf - Hiện tại, có vấn đề với sự cố này ... http: //stackoverflow.com/questions/7003152/openentitymanagerinviewfilter-problems...mind hãy xem? – sauce

+0

ai đó có thể đưa ra một ví dụ về cách viết phương pháp bằng? bởi vì tôi đã sử dụng Eclipse tạo ra hàm equals và hashcode nhưng tôi có một số vấn đề ... cảm ơn – SaganTheBest