I changed my example and hope it is now easier to understand. A user can subscribe to 0-n newsletters.
Summary:
I have a List<Newsletter> as the referenceData. I have a List<Newsletter> as a property of my FormBackingObject. The boxes corresponding to the Newsletters which are in the FormBackingObjects lists are checked. Fine! When I click on some boxes, a Data Binding Error occurs. I hoped the FormBackingObject's old List<Newsletter> would be replaced by a list corresponding to the selected boxes.
Code:
public interface Newsletter {
public String getLabel();
public String getId();
}
public class PetNewsletter implements Newsletter {
...
}
public class GardenNewsletter implements Newsletter {
...
}
My FormBackingObject is an inner class called UserChoice:
Code:
public class UserChoice {
List<Newsletter> selectedNewsletters = new ArrayList<Newsletter>();
public UserChoice(User user) {
List<Newsletter> usersSelection = this.getNewsletters(user);
this.setSelectedNewsletters(usersSelection);
}
public List<Newsletter> getSelectedNewsletters() {
return selecteNewsletters;
}
public void setSelectedNewsletters(List<Newsletter> selectedNewsletters) {
this.selectedNewsletters = selectedNewsletters;
}
}
protected Object formBackingObject(HttpServletRequest request) throws Exception {
User user = userManager.getUser();
return new UserChoice(user);
}
The referenceData is a list of all available Newsletters:
Code:
protected Map<String,Object> referenceData(HttpServletRequest request) throws Exception {
List<Newsletter> allNewsletters = newsletterManager.getAllNewsletters();
model.put("allNewsletters", allNewsletters);
return model;
}
Inside the JSP I create a list of checkboxes:
Code:
<spring-form:form>
<spring-form:checkboxes path="selectedNewsletters" items="${allNewsletters}" />
<input type="submit" name="submit" value="Submit" />
</spring-form:form>
The form seems to work: If the FormBackingObject contains 3 Newsletters, the corresponding checkboxes are checked. The problem is, that my selection can not be written back to the bound UserChoice object. If I select more than 0 checkboxes a "Data binding errors: 1" occurs and I get redirected to the form. I also tried the attributes
Code:
itemLabel="label" (works fine)
itemValue="id" (the HTML is now value="petletter" instead of "...PetNewsletter@12394", but no further effect)