2011-04-29 53 views
3

我有一个问题,使用HtmlDataTable查看数据库中的数据。h:dataTable绑定=>重复ID

当我创建组件时,该表有时(并非总是)列数的两倍

它显示正确,并经过多次刷新(无需移动dtb或东西)有例如6列而不是3和应用程序(有时)变得不稳定。 这段时间以来,因为它会报告 “副本ID的一个组成部分” 我不能与表工作..

简单的例子(来源:http://balusc.blogspot.com/2006/06/using-datatables.html):

<h:form id="bde"> 
    <h:dataTable id="tbl" 
       binding="#{myBDE.dataTable}" 
       value="#{myBDE.dataList}" 
       var="bdeItem"> 
    <h:column> 
     <f:facet name="header"> 
     <h:outputText value="S" /> 
     </f:facet> 
     <h:outputText value="#{bdeItem.s}" rendered="#{!myBDE.editModeRow}"/> 
     <h:inputText value="#{bdeItem.s}" rendered="#{myBDE.editModeRow}" required="true" size="3"/> 
    </h:column> 

    <h:column> 
     <f:facet name="header"> 
     <h:outputText value="ID" /> 
     </f:facet> 
     <h:outputText value="#{bdeItem.id}"/> 
    </h:column> 
    </h:dataTable> 
</h:form> 

而且的java.class

protected HtmlDataTable dataTable; 

public void setDataTable(HtmlDataTable dataTable) 
{ 
    this.dataTable = dataTable; 
} 

public HtmlDataTable getDataTable() 
{ 
    if (dataTable == null) 
    { 
    dataTable = new HtmlDataTable(); 
    dataTable.setRows(DEFAULT_TABLE_ROWS); 
    } 
    return dataTable; 
} 

和错误消息:

javax.servlet.ServletException: Component ID j_idt92:bde:tbl:j_idt129 has already been found in the view.  
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:422) 

root cause 

java.lang.IllegalStateException: Component ID j_idt92:bde2:tbl:j_idt129 has already been found in the view.  
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:821) 
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805) 
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805) 
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805) 
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805) 
    com.sun.faces.util.Util.checkIdUniqueness(Util.java:805) 
    com.sun.faces.application.view.StateManagementStrategyImpl.saveView(StateManagementStrategyImpl.java:144) 
    com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:133) 
    com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225) 
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:418) 
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:410) 

关注由组件树编辑。 我没有什么重复的代码,但dataTable创建一个新的列,然后它真的重复

我有两个工作相似的模块,第三没有工作。

你有没有遇到过这种问题?

感谢意见

回答

5

如果Bean是会话范围,而不是请求范围和你分享多个视图中这个bean会发生这种情况。最好的做法是将组件绑定到的bean保留在请求范围中。

也可以使用DataModel作为值,而不是将表绑定到HtmlDataTable,如果功能要求是获取当前选定的行。

+0

你救了我(再次)。我花了整整一天的时间,没有任何东西。现在它的工作!谢谢,BalusC – gaffcz 2011-04-29 20:24:47

+0

我希望,已经完成了。再次感谢! – gaffcz 2011-04-29 20:36:04

+0

BalusC,在更改范围请求后,我无法再使用DataTable(保存,编辑,删除,添加到dtb)。它报告空异常,因为对象在响应后到期。以某种方式我可以使用吗?我试图使用ViewScope,但它似乎不与绑定HtmlDataTable。或者有另一种方法来解决它?或者我应该尝试使用DataModel? – gaffcz 2011-04-30 09:05:13