Jsf ui:重复不在h:dataTable内工作

Jsf ui:重复不在h:dataTable内工作,jsf,datatable,uirepeat,Jsf,Datatable,Uirepeat,我对h:dataTable标记中的ui:repeat有问题。我有一个包含字段名称的集合,另一个包含数据。所以我用索引匹配它们。当我加载页面时,抛出异常OutOfBoundsException。但当我将filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)放在ui:repeat之外时,它会显示正确的索引。所以我尝试将其拆分,并将ui:param和c:set声明为变量,但问题相同cardDataactualC

我对
h:dataTable
标记中的
ui:repeat
有问题。我有一个包含字段名称的集合,另一个包含数据。所以我用索引匹配它们。当我加载页面时,抛出异常
OutOfBoundsException
。但当我将
filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)
放在
ui:repeat
之外时,它会显示正确的索引。所以我尝试将其拆分,并将
ui:param
c:set
声明为变量,但问题相同
cardData
actualCard的属性不为null,也不为空,其中有7项,我已经调试过了。那么你知道问题出在哪里吗

PS:当我为
h:dataTable
更改
ui:repeat
时,它正在工作。最棒的是,在另一个JSF页面上使用了相同的结构,它正在工作,只有一个区别——我从一个外部数据表中引用的卡片中获得
cardData
,因此它不是
Bean(dot)
属性等等,而是
变量(dot)
等等

有什么想法吗?谢谢你的帮助。:)


由于使用
变量
检索
值,所以
内部不起作用

由于不清楚的原因,
最后一次使用
null
值在列表的所有对象上正确迭代一次。最后一次迭代会破坏

解决方案是在获取
ui:repeat
值时处理此问题。例如,如果您有以下内容:

<h:dataTable value="#{someBean.parentObjList}" var="obj">
  <h:column>
    <ui:repeat value="#{someBean.getChildren(obj)" var="child" >
       ...
    </ui:repeat>
  </h:column>
</h:dataTable>

...
在控制器中:

public List<ChildObj> getChildren(ParentObj obj) {
  return parentObjService.findAllFor(obj);
}
public List getChildren(ParentObj obj){
返回parentObjService.findAllFor(obj);
}
然后,您需要将其替换为:

public List<ChildObj> getChildren(ParentObj obj) {
  if (obj == null)
    return new ArrayList<ChildObj>(); // return empty ArrayList to avoid crashing
  else 
    return parentObjService.findAllFor(obj);
}
public List getChildren(ParentObj obj){
if(obj==null)
返回新的ArrayList();//返回空的ArrayList以避免崩溃
其他的
返回parentObjService.findAllFor(obj);
}

哪个JSF impl/版本?最近试过吗?Mojarra中有很多bug,其中大部分应该已经通过当前最新的2.2.12消除。当前的答案只显示了一个解决方案,而不是一个解决方案。尽管如此,在getter中执行业务逻辑是一个坏主意。您最好重新编写控制器,以便准确地预填充视图所期望的模型,而不是让视图通过getter填充模型(这显然是低效的)。另见a.o。
public List<ChildObj> getChildren(ParentObj obj) {
  if (obj == null)
    return new ArrayList<ChildObj>(); // return empty ArrayList to avoid crashing
  else 
    return parentObjService.findAllFor(obj);
}