2011-04-29 4 views
3

J'ai un problème lors de l'utilisation de HtmlDataTable pour l'affichage des données de la base de données.h: liaison dataTable => ID en double

Lorsque je crée un composant, la table a parfois (pas toujours) deux fois le nombre de colonnes.

Il est affiché correctement et après plusieurs rafraîchissements (sans déplacement en dtb ou autre) il y a par exemple 6 colonnes au lieu de 3 et l'application (parfois) devient instable. Depuis cette époque, je ne peux pas travailler avec table parce qu'il rapporte "double Id pour un composant" ..

Exemple simple (source: 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> 

Et 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; 
} 

Et le message d'erreur:

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) 

Suivre ed par arbre de composants. Je pense qu'il n'y a rien de dupliqué dans le code, mais dataTable crée une nouvelle colonne et ensuite elle est vraiment dupliquée

J'ai deux modules similaires qui fonctionnent, et le troisième ne marche pas.

Avez-vous déjà rencontré ce genre de problème?

Merci pour les conseils

Répondre

5

Cela peut se produire si le haricot est la session scope au lieu de demande scope et vous partagez ce haricot entre plusieurs vues. Le mieux est de garder le bean auquel le composant a été lié dans la portée de la requête. En guise d'alternative, vous pouvez également utiliser DataModel comme valeur au lieu de lier la table à HtmlDataTable si l'exigence fonctionnelle est d'obtenir la ligne actuellement sélectionnée.

+0

Vous m'avez sauvé (encore). J'ai passé toute la journée là-dessus et rien. Et maintenant ça marche! Merci, BalusC – gaffcz

+0

J'espère, c'est fait. Merci encore! – gaffcz

+0

BalusC, après avoir modifié la portée de la requête, je ne peux plus travailler avec DataTable (enregistrer, éditer, supprimer, ajouter à dtb). Il signale une exception nulle, car l'objet expire après la réponse. Puis-je utiliser d'une manière ou d'une autre? J'ai essayé d'utiliser ViewScope mais il ne semble pas avec Binding HtmlDataTable. Ou y a-t-il une autre façon de le résoudre? Ou devrais-je vraiment essayer d'utiliser DataModel? – gaffcz

Questions connexes