2011-09-14 26 views
8

Formum onay kutularına bağlanacak şekilde benim formumu almak için görünmüyor. Burada birçok yazı okudum ve birkaç teknik denedim ama şans yok. Belki yeni bir göz seti yardımcı olur.Yay Bağlama Listesi <Object> Form: onay kutuları

benim denetleyicisi:

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

benim JSP:

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

oluşturulan html: I (gösterilmemiştir), her bir döngü emin olmak için uygun bir ikinci kullanılan

<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"/> 

model nesnesi rolleri içeriyordu. Bunu yapar, ancak onay kutularının hiçbiri işaretlenmez ve rolleri gönderdiğimde her zaman boştur. Birisi bana neyi kaçırdığımı söyler mi?

Teşekkür

DÜZENLEME

Maalesef sadece hesap ve rol nesneleri görmek için yararlı olabilir fark:

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; 
} 

}

DÜZENLEME 2.

Kontrolör Mesaj Yöntem

@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); 
} 

HesapEditForm form yedekleme nesnesidir. Bir GET yaptığımda, bir Hesap nesnesini alıp değerleri görüntülemeden önce bir AccountEditForm'a geçiriyorum. Ben sadece açıklık için AccountEditForm ekleyeceğim. Hesap nesnesine çok benzer. Form nesnelerini model objelerimden ayırmaya başladım.

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); 
    } 

} 

DÜZENLEME 3. Rol Mülkiyet Editör gibi benim denetleyicisi Tanımlı

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())); 
} 

DÜZENLEME 4. YENİ 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); 
    } 
} 

cevap

3

bir yöntemini eşittir ekle rolünüz var. Bu answer (Spring MVC Pre Populate Checkboxes): Daha fazla bilgi için benzer bir soruya bakın.

+0

Yanıt için teşekkürler.Role nesnesine eşit ekledim ve şimdi ekrana baktığımda onay kutularının doğru şekilde doldurulduğunu ancak bir değişiklik yaptığımda veya gönderme yaptığımda form nesnesine bağlı hesap nesnesinin rolleri özelliği her zaman boş olur. – blong824

+0

@ blong824 Rol nesnelerinin alt nesne olmadığından, Hesap nesnesinde yer almıyor veya kaydedilmiyor mu? – Ralph

+0

Kaydetmek için tüm kodu kaldırdım ve post yöntemine bir baskı ifadesi ekledim. Roller nesnesi her zaman boştur. Yani Hesap nesnesinde doldurulmadı. – blong824

0

Sorunun yoldaki karmaşık nesne listesini kullandığını buldum. combox, sadece "value" alanında neyin olduğu gibi görünüyor. SO Listeye bağlanan değişkeni Liste yerine Listele olarak değiştirdim ve listenin kimlikleri tarafından doldurulduğunu öğrendim.

0

Varlıklarınızın uygulamanızın equals ve hashCode yöntemini eksik olarak görüyorsunuz.

İlgili konular