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
Vous m'avez sauvé (encore). J'ai passé toute la journée là-dessus et rien. Et maintenant ça marche! Merci, BalusC – gaffcz
J'espère, c'est fait. Merci encore! – gaffcz
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