2

我有这个:

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

4

1 回答 1

4

<ui:repeat>Set<E>支持。这种支持将在即将到来的 JSF 2.2(也适用于)中引入。<h:dataTable>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。特别是 h:datatable?

此问题与嵌套无关<ui:repeat>

于 2012-05-14T15:25:00.623 回答