h:dataTable binding =>重复ID

gaf*_*fcz 3 java jsf

我使用HtmlDataTable查看数据库中的数据时遇到问题.

当我创建组件时,该表有时(不总是)两列的列数.

它被正确显示并且经过几次刷新(没有在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> 
Run Code Online (Sandbox Code Playgroud)

和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;  
} 
Run Code Online (Sandbox Code Playgroud)

和错误消息:

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)  
Run Code Online (Sandbox Code Playgroud)

其次是组件树.我认为代码中没有任何重复,但dataTable创建了一个新列,之后它真的是重复的

我有两个工作类似的模块,第三个不起作用.

你遇到过这种问题吗?

谢谢你的建议

Bal*_*usC 6

如果bean是会话作用域而不是请求作用域,并且您在多个视图之间共享此bean,则会发生这种情况.最好的方法是在请求范围内保留组件绑定到的bean.

作为替代方案,如果功能要求是获取当前选定的行,您还可以使用DataModelas值而不是绑定表HtmlDataTable.

  • 解决了> @ViewScoped +实现Serializable +私有瞬态HtmlDataTable (2认同)