ui:在ui中重复:重复

时间:2012-05-14 15:05:52

标签: jsf facelets uirepeat

我有这个:

<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}正在正确返回产品代码。

1 个答案:

答案 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>无关。