Récursivité dans JSF (c:forEach vs ui:repeat)

Je suis en train de construire une arborescence de navigation via la récursivité dans le programme JSF. J'ai défini un navigationNode composant:

<composite:interface>
    <composite:attribute name="node" />
</composite:interface>

<composite:implementation>
<ul>
    <ui:repeat value="#{navigationTreeBean.getChildrenForNode(cc.attrs.node)}" var="child">
        <li><navigation:navigationNode node="#{child}" /></li>
    </ui:repeat>
</ul>
</composite:implementation>

Mon arbre est déclarée comme suit:

rootNode = new DefaultMutableTreeNode(new NodeData("Dashboard", "dashboard.xhtml"), true);
DefaultMutableTreeNode configurationsNode = new DefaultMutableTreeNode(new NodeData("Configurations", "configurations.xhtml"), true);
rootNode.add(configurationsNode);

J'appelle composante par:

<nav:navigationNode node="#{rootNode}" />

Le problème est, il en résulte StackOverflowError.

Il y a quelques références à la construction de la récursivité dans JSF (par exemple, c:forEach vs ui:repeat dans Facelets). Le problème commun semble être le mélange de la construction et de rendre les composants/tags. Dans mon cas:

  • Mon composite composant est en fait une balise, qui est exécutée lorsque l'arbre est construit
  • ui:repeat est un réel JSF élément, qui est évalué lorsque l'arbre est rendu

Est l'enfant du composant navigation:navigationNode réellement traitée avant la ui:repeat composant? Si oui, quel objet est-il de l'aide pour #{child}? Est-il nul (ne semble pas si)? Le problème est ici que le composant enfant est effectivement créé, sans même se soucier de l'interface utilisateur:répéter et à chaque fois un nouveau composant enfant est créé, même si elle n'est pas forcément voulu?

La c:forEach vs ui:repeat dans Facelets article a une section distincte pour cette (récursivité). La suggestion est d'utiliser c:forEach à la place. J'ai essayé ceci, cependant, c'est toujours de me donner la même StackOverflowError, avec différentes traces que je ne peut pas donner un sens.

Je sais que nous pouvons également créer des composants en étendant UIComponent, mais cette approche (l'écriture de code html dans le code Java) semble laid. Je préfère utiliser MVC de style ou de modèles. Cependant, si il n'y a pas d'autres moyens, dois-je mettre en œuvre cette sorte de récursivité comme UIComponent à la place?

OriginalL'auteur Tuukka Mustonen | 2010-08-16