2011-09-14 38 views
8

Tôi dường như không thể lấy biểu mẫu của mình để ràng buộc với kiểm soát hộp kiểm. Tôi đọc nhiều bài viết ở đây và thử một vài kỹ thuật nhưng không may mắn. Có lẽ một bộ mắt mới sẽ giúp ích.Danh sách ràng buộc mùa xuân <Object> để biểu mẫu: hộp kiểm

điều khiển của tôi:

public String editAccount(@RequestParam("id") String id, Model model) { 
    model.addAttribute("account", accountService.getAccount(id)); 
    model.addAttribute("allRoles", roleService.getRoles()); 
    return EDIT_ACCOUNT; 
} 

jsp của tôi:

<form:form action="" modelAttribute="account"> 
<form:checkboxes items="${allRoles}" path="roles" itemLabel="name" itemValue="id" delimiter="<br/>"/> 
</form> 

html tạo:

<span><input id="roles1" name="roles" type="checkbox" value="1"/><label for="roles1">User</label></span><span><br/><input id="roles2" name="roles" type="checkbox" value="2"/><label for="roles2">Admin</label></span><span><br/><input id="roles3" name="roles" type="checkbox" value="3"/><label for="roles3">SuperAdmin</label></span<input type="hidden" name="_roles" value="on"/> 

tôi đã sử dụng một giây cho mỗi vòng lặp (không hiển thị) để đảm bảo rằng đối tượng mô hình chứa các vai trò. Nó có, nhưng không có hộp kiểm nào được chọn và khi tôi gửi đối tượng vai trò luôn trống. Ai đó có thể cho tôi biết tôi đang thiếu gì không?

Cảm ơn

EDIT

Xin lỗi chỉ nhận ra nó có thể hữu ích để xem tài khoản và vai trò của các đối tượng:

public class Account { 

    private String username, firstName, lastName, email; 
    private List<Role> roles; 

    @NotNull 
    @Size(min = 1, max = 50) 
    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @NotNull 
    @Size(min = 1, max = 50) 
    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @NotNull 
    @Size(min = 1, max = 50) 
    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @NotNull 
    @Size(min = 6, max = 50) 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

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

    public void setRoles(List<Role> roles) { 
     this.roles = roles; 
    } 

    public String toString() { 
     return ReflectionToStringBuilder.toString(this); 
    } 

} 

public class Role { 

private int id; 
private String name; 

public Role() {} 

public Role(int id, String name) { 
    this.id = id; 
    this.name = name; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

@NotNull 
@Size(min = 1, max = 50) 
public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

}

EDIT # 2

điều khiển bài viết Phương pháp

@RequestMapping(value = "edit", method = RequestMethod.POST) 
public String updateAccount(@RequestParam("id") String id, @ModelAttribute("account") @Valid AccountEditForm form, BindingResult result) { 
    System.out.println("FORM VALUES AFTER: " + form); 
    return (result.hasErrors() ? EDIT_ACCOUNT : ACCOUNT_REDIRECT); 
} 

AccountEditForm là đối tượng sao lưu biểu mẫu. Khi tôi làm một GET tôi lấy một đối tượng tài khoản và chuyển các giá trị vào một AccountEditForm trước khi hiển thị màn hình. Tôi sẽ đính kèm AccountEditForm chỉ để làm rõ. Nó rất giống với đối tượng tài khoản. Tôi chỉ xảy ra để tách riêng các đối tượng mẫu của tôi khỏi các đối tượng mô hình của tôi.

public class AccountEditForm { 

    private String username, firstName, lastName, email; 
    private List<Role> roles = new ArrayList<Role>(); 

    @NotNull 
    @Size(min = 1, max = 50) 
    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @NotNull 
    @Size(min = 1, max = 50) 
    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @NotNull 
    @Size(min = 1, max = 50) 
    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @NotNull 
    @Size(min = 6, max = 50) 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

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

    public void setRoles(List<Role> roles) { 
     this.roles = roles; 
    } 

    public String toString() { 
     return ReflectionToStringBuilder.toString(this); 
    } 

} 

EDIT # 3 Vai trò tài sản biên tập

public class RolePropertyEditor extends PropertyEditorSupport { 

    private Map<Integer, Role> roleMap = new HashMap<Integer, Role>(); 

    public RolePropertyEditor(List<Role> roleList) { 
     for (Role r : roleList) roleMap.put(r.getId(), r); 
    } 

    public void setAsText(String incomingId) { 
     Role role = roleMap.get(incomingId); 
     System.out.println("PROPERTY EDITOR ROLE " + role); 
     setValue(role); 
    } 

    public String getAsText() { 
     System.out.println("PROPERTY EDITOR ID " + ((Role)getValue()).getId()); 
     return String.valueOf(((Role)getValue()).getId()); 
    } 
} 

Defined trong bộ điều khiển của tôi như:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.setAllowedFields(new String[] { 
      "username", "password", "confirmPassword", "firstName", "lastName", "email", "acceptTerms", "currentPassword" 
    }); 
    binder.registerCustomEditor(Role.class, new RolePropertyEditor(roleService.getRoles())); 
} 

EDIT # 4 MỚI ProeprtyEditor

public class SecurityRolePropertyEditor extends PropertyEditorSupport { 

    private RoleService roleService; 

    public SecurityRolePropertyEditor(RoleService roleService) { 
     this.roleService = roleService; 
    } 

    public void setAsText(final String name) { 
     Role role = roleService.getRoleByName(name); 
     setValue(role); 
    } 
} 

Trả lời

3

Thêm một phương thức equals để thực thể Vai trò của bạn.

xem điều này answer (Spring MVC Pre Populate Checkboxes): của một câu hỏi tương tự để biết thêm chi tiết.

+0

Cảm ơn bạn đã trả lời.Tôi thêm vào bằng đối tượng Vai trò của tôi và bây giờ khi tôi xem màn hình, các hộp kiểm được điền chính xác nhưng khi tôi thực hiện thay đổi hoặc thực hiện gửi, thuộc tính vai trò của đối tượng tài khoản được liên kết với biểu mẫu luôn trống. – blong824

+0

@ blong824 Vấn đề là các đối tượng Vai trò không phải là phụ đề, không được điền trong đối tượng Tài khoản hay không được lưu? – Ralph

+0

Tôi đã xóa tất cả mã để lưu và chỉ cần thêm tuyên bố in vào phương thức bài đăng. Đối tượng vai trò luôn trống. Vì vậy, không được điền trong đối tượng Tài khoản. – blong824

0

Tôi thấy rằng sự cố đang sử dụng danh sách đối tượng phức tạp trong đường dẫn. combox dường như chỉ gửi nội dung trong trường "giá trị". SO Tôi đã thay đổi biến được liên kết với đường dẫn đến Danh sách thay vì Danh sách và phát hiện ra danh sách được điền bởi các ID.

0

Có vẻ như bạn đang thiếu phương thức triển khai equalshashCode về pháp nhân của mình.

Các vấn đề liên quan