[SPRING] Spring 바인딩 <Object> to Form : 체크 박스
SPRINGSpring 바인딩
폼을 체크 박스 컨트롤에 바인딩 할 수없는 것 같습니다. 나는 여기에 많은 게시물을 읽고 몇 가지 기법을 시도했지만 운이 없다. 어쩌면 새로운 눈 세트가 도움이 될 것입니다.
내 컨트롤러 :
public String editAccount(@RequestParam("id") String id, Model model) {
model.addAttribute("account", accountService.getAccount(id));
model.addAttribute("allRoles", roleService.getRoles());
return EDIT_ACCOUNT;
}
내 JSP :
<form:form action="" modelAttribute="account">
<form:checkboxes items="${allRoles}" path="roles" itemLabel="name" itemValue="id" delimiter="<br/>"/>
</form>
생성 된 html :
<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"/>
모델 객체에 역할이 포함되었는지 확인하기 위해 각 루프 (표시되지 않음)에 초를 사용했습니다. 그것은, 그러나 체크 박스의 아무도는 체크되고 나가 언제 역할 객체를 복종시킬 때 항상 비운다. 누군가 내가 놓친 걸 말해 줄 수 있니?
감사
편집하다
죄송합니다. 계정 및 역할 개체를 보는 것이 도움이 될 수 있음을 깨달았습니다.
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;
}
}
2 번 수정
컨트롤러 포스트 방법
@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은 양식지지 오브젝트입니다. GET을 할 때 Account 객체를 잡고 화면을 표시하기 전에 AccountEditForm에 값을 전달합니다. 나는 명확성을 위해서 AccountEditForm을 첨부 할 것이다. 계정 개체와 매우 유사합니다. 방금 모델 개체에서 양식 객체를 분리했습니다.
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);
}
}
편집 # 3 역할 속성 편집기
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());
}
}
내 컨트롤러에 정의 된 :
@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()));
}
# 4 새로운 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);
}
}
해결법
-
==============================
1.Roles 엔터티에 equals 메서드를 추가합니다.
Roles 엔터티에 equals 메서드를 추가합니다.
(Spring MVC Pre Populate Checkboxes) : 자세한 내용은 비슷한 질문이다.
-
==============================
2.엔티티에서 equals 및 hashCode 메소드가 누락되었습니다.
엔티티에서 equals 및 hashCode 메소드가 누락되었습니다.
from https://stackoverflow.com/questions/7421346/spring-binding-listobject-to-formcheckboxes by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Data Mongo로 여러 MongoDB 저장소 구성 (0) | 2019.02.18 |
---|---|
[SPRING] Set 컬렉션의 객체 바인딩 (0) | 2019.02.18 |
[SPRING] Spring @Autowired의 동작을 재정의하는 방법 (0) | 2019.02.18 |
[SPRING] POST에서 빈 문자열을 제공하는 Spring @RequestBody (0) | 2019.02.18 |
[SPRING] XML 대신 Java를 사용하여 Spring Boot에서 hbase를 사용하는 방법은 무엇입니까? (0) | 2019.02.18 |