我有一个 JSP 生成的表单,它需要向用户显示选项列表。其中一些是单实例选项(例如是否生成目录),这很好用。我现在需要添加一个从属选项列表,并允许用户打开或关闭每个选项。我可以在 JSP 页面中生成选项列表,并给每个选项一个唯一的 ID。我希望用<form:checkbox/>
表格中的一个元素来代表一个。
选项类如下所示:
// Option class
public class PdfCatalogOptions
{
private boolean isTableOfContentsIncluded;
private List<ProductGroup> productGroups;
public boolean getTableOfContentsIncluded () {
return isTableOfContentsIncluded;
}
public PdfCatalogOptions setTableOfContentsIncluded ( final boolean isTableOfContentsIncluded ) {
this.isTableOfContentsIncluded = isTableOfContentsIncluded;
return this;
}
public List<ProductGroup> getProductGroups() {
return productGroups;
}
public PdfCatalogOptions setProductGroups( final List<ProductGroup> setProductGroups ) {
this.productGroups = productGroups;
return this;
}
}
产品组类如下所示:
public class ProductGroup
{
private String groupName;
private boolean isSelected;
public String getGroupName () {
return groupName;
}
public ProductGroup setGroupName ( final String groupName ) {
this.groupName = groupName;
return this;
}
public Boolean getIsSelected () {
return isSelected;
}
public ProductGroup setIsSelected ( final boolean selected ) {
isSelected = selected;
return this;
}
}
在get
控制器内的处理程序中,我这样做:
@RequestMapping( method = RequestMethod.GET )
public String get ( final Model model ) throws Exception {
model.addAttribute ( "options", new PdfCatalogOptions ().setProductGroups ( buildProductGroupList () ) );
return FormName.GENERATE_CATALOG;
}
里面的逻辑buildProductGroupList
无关紧要——它只是生成一个填充了我需要的数据ArrayList
的对象。ProductGroup
我遇到的问题是我似乎无法说服 Spring 绑定到对象内单个ProductGroup
对象内的字段PdfCatalogOptions
。
JSP 看起来像这样:
<form:form action="generateCatalog.do" commandName="options">
<table>
<tr>
<td colspan="3"><form:errors cssClass="error"/></td>
</tr>
<tr>
<td><spring:message code="catalog.include.toc"/></td>
<td><form:checkbox path="tableOfContentsIncluded"/></td>
</tr>
<tr>
<td> </td>
</tr>
<c:forEach items="options.productGroups" var="productGroup">
<tr>
<td> </td>
<td><form:checkbox path="productGroup.isSelected"/>blah</td>
</tr>
</c:forEach>
</table>
</form:form>
在内部<c:forEach...>
循环中,我找不到正确的咒语来让 Spring 绑定到各个ProductGroup
对象,因此我最终可以得到一个ProductGroup
对象列表,其中isSelected
包含用户要求的属性设置。
如前所述,它抱怨说:
org.springframework.beans.NotReadablePropertyException: Invalid property 'productGroup' of bean class [<redacted>.PdfCatalogOptions]: Bean property 'productGroup' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
谁能在这里指出我正确的方向?
编辑 1:这正确列出了所有产品组:
<c:forEach items="${options.productGroups}" var="pg">
<tr>
<td>${pg.groupName}</td>
</tr>
</c:forEach>
这些值在那里并按我的预期显示。但是,我不能做的是找到一种将值路径绑定到复选框的方法。如果我添加<form:checkbox path="pg.isSelected"/>
,那么我被告知这pg
不是PdfCatalogOptions
.
如果我添加<form:checkbox path="${pg.isSelected}"/>
,那么我被告知——在某种程度上可以预见——这true
不是PdfCatalogOptions
.