Printemps de Liaison de la Liste<Object> Forme:cases à cocher
Je n'arrive pas à obtenir mon formulaire pour lier les cases de contrôle. J'ai lu beaucoup de posts ici et essayé quelques techniques, mais pas de chance. Peut-être un regard neuf aidera.
mon contrôleur:
public String editAccount(@RequestParam("id") String id, Model model) {
model.addAttribute("account", accountService.getAccount(id));
model.addAttribute("allRoles", roleService.getRoles());
return EDIT_ACCOUNT;
}
ma jsp:
<form:form action="" modelAttribute="account">
<form:checkboxes items="${allRoles}" path="roles" itemLabel="name" itemValue="id" delimiter="<br/>"/>
</form>
le code html généré:
<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"/>
J'ai utilisé une seconde pour chaque boucle (non illustré) pour s'assurer que le modèle objet contenait les rôles. Il n'est, pourtant, aucun des cases sont cochées et quand je soumettre les rôles de l'objet est toujours vide. Quelqu'un peut-il me dire ce que je suis absent?
Grâce
MODIFIER
Désolé viens de réaliser qu'il pourrait être utile de voir le compte et le rôle des objets:
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
Contrôleur Méthode Post
@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 est la forme la sauvegarde de l'objet. Quand je fais un GET je prends un objet de Compte et transmettre les valeurs dans un AccountEditForm avant l'affichage de l'écran. Je vais joindre le AccountEditForm juste pour plus de clarté. Il est très similaire à l'objet de compte. Je l'ai séparé mes objets de formulaire à partir de mon modèle d'objets.
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 Rôle de la Propriété de l'Éditeur
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());
}
}
Définie dans mon contrôleur comme:
@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 NOUVEAUX 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);
}
}
OriginalL'auteur blong824 | 2011-09-14
Vous devez vous connecter pour publier un commentaire.
Ajouter une méthode equals pour vos Rôles de l'entité.
voir ce réponse (Spring MVC Pré Remplir des Cases à cocher): une question similaire pour plus de détails.
Le problème est que le Rôle des objets ne sont pas submittet, pas renseignées dans le Compte de l'objet ou pas sauvé?
J'ai enlevé tout le code pour enregistrer et vient d'ajouter une instruction print de la méthode post. Les rôles de l'objet est toujours vide. Afin de ne pas renseignée dans le Compte de l'objet.
pourriez-vous s'il vous plaît ajouter la post-méthode?
Il est ajouté en vertu de l'Edit #2
OriginalL'auteur Ralph
Il semble que vous êtes absent de mise en œuvre
equals
ethashCode
méthode sur vos entités.OriginalL'auteur Arip H