我有这个:
<ui:repeat value="#{orderController.listRequestItem}" var="item">
....
<tbody>
<tr>
<td>#{item.product.codigoProduto}</td>
<td>
<ui:repeat value="#{item.product.materials}" var="m">
#{m.description}
</ui:repeat>
</td>
...
listRequestItem
是:
public List<RequestItemVO> listRequestItem;
在这里我填充它:
listRequestItem = new ArrayList<>(requestVO1.getRequestItem());
item.product.materials
是:
public Set<MaterialVO> getMaterials()
{
//compiled code
throw new RuntimeException("Compiled Code");
}
当我尝试访问内部m
上的<ui:repeat>
时,我无法访问其方法。
#{item.product.codigoProduto}
正在正确返回产品代码。
答案 0 :(得分:4)
<ui:repeat>
不支持Set<E>
。即将到来的JSF 2.2(也适用于<h:dataTable>
),此支持将为introduced。 JSF 2.2将于本季度发布。
同时,您需要将其转换为List
。有几种方法:
将属性更改为List<MaterialVO>
,并相应地更改业务代码。
private List<MaterialVO> materials;
或添加包装器属性并改为使用它。
public List<MaterialVO> getMaterialList() {
return new ArrayList<MaterialVO>(materials);
}
这只是昂贵的,因为每次迭代都会调用getter。您可能想要添加另一个包装原始集的属性。
或者创建一个自定义EL功能来完成这项工作:
<ui:repeat value="#{util:setToList(item.product.materials)}" ...>
或创建自定义EL解析器。详情可在以下答案中找到:How do I use a java.util.Set with UIData in JSF. Specifically h:datatable?
此问题与嵌套<ui:repeat>
无关。