2011-09-14 14 views
8

मुझे लगता है कि चेकबॉक्स नियंत्रण में बाध्य करने के लिए मेरा फॉर्म नहीं मिल रहा है। मैंने यहां कई पोस्ट पढ़ी और कुछ तकनीकों की कोशिश की लेकिन कोई किस्मत नहीं। शायद आंखों का एक नया सेट मदद करेगा।स्प्रिंग बाइंडिंग सूची <Object> फॉर्म में: चेकबॉक्स

मेरी नियंत्रक:

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> 

उत्पन्न एचटीएमएल:

<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 फॉर्म बैकिंग ऑब्जेक्ट है। जब मैं एक प्राप्त करता हूं तो मैं एक खाता ऑब्जेक्ट लेता हूं और स्क्रीन को प्रदर्शित करने से पहले मान को एडिट एडिटफॉर्म में पास करता हूं। मैं सिर्फ स्पष्टता के लिए 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); 
    } 
} 

उत्तर

3

एक करने के लिए विधि के बराबर होती है जोड़े आपकी भूमिका इकाई

यह answer (Spring MVC Pre Populate Checkboxes) देखें: अधिक जानकारी के लिए एक समान प्रश्न के।

+0

प्रतिक्रिया के लिए धन्यवाद।मैंने अपनी रोल ऑब्जेक्ट के बराबर जोड़ा और अब जब मैं स्क्रीन देखता हूं तो चेकबॉक्स सही तरीके से आते हैं लेकिन जब मैं कोई परिवर्तन करता हूं या सबमिट करता हूं, तो फॉर्म ऑब्जेक्ट की भूमिका वस्तुएं हमेशा खाली होती हैं। – blong824

+0

@ blong824 क्या समस्या है कि रोल ऑब्जेक्ट्स सबमिट नहीं हैं, खाता ऑब्जेक्ट में पॉप्युलेट नहीं हैं या सहेजे नहीं गए हैं? – Ralph

+0

मैंने सहेजने के लिए सभी कोड हटा दिए और पोस्ट विधि में एक प्रिंट स्टेटमेंट जोड़ा। भूमिका वस्तु हमेशा खाली होती है। तो खाता ऑब्जेक्ट में पॉप्युलेट नहीं किया गया। – blong824

0

मुझे पता चला कि समस्या पथ में जटिल वस्तु की सूची का उपयोग कर रही थी। combox केवल "मान" फ़ील्ड में सबमिट करने के लिए प्रतीत होता है। इसलिए मैंने सूची के बजाय सूची में पथ के लिए बाध्य परिवर्तक को बदल दिया और पता चला कि सूची आईडी द्वारा पॉप्युलेट की गई है।

0

ऐसा लगता है कि आप अपनी इकाइयों पर कार्यान्वयन equals और hashCode विधि अनुपलब्ध हैं।

संबंधित मुद्दे