Я всегда получаю StackOverflowError
Тогда вы наверняка пришли на нужный сайт сейчас;)
Шутки в сторону, составные компоненты, к сожалению, не поддерживают рекурсию. В своей работе мы недавно работали над компонентом, к которому предъявлялись аналогичные требования, и способ, которым мы решили его, заключался в замене прямой рекурсии несколькими компонентами на основе Java, которые можно поместить в составной компонент для объявления рекурсивной структуры.
Я не могу дать фактический код, так как он защищен авторским правом моей компании, но ниже приведен пример того, как его можно использовать:
<jcf:recursion value="#{foo.someData}" var="item">
<jcf:recursionNode level="0">
<jcf:recursionNodeItem rendered="#{foo.someCondition}">
<!-- Some markup possibly referencing item -->
<jcf:insertRecursionNodeChildren />
<!-- Some more markup -->
</jcf:recursionNodeItem>
</jcf:recursionNode>
<jcf:recursionNode>
<!-- Some markup -->
<jcf:recursionNodeItem rendered="#{foo.someOtherCondition}">
<!-- Some more markup -->
<jcf:insertRecursionNodeChildren />
<!-- Some more markup -->
</jcf:recursionNodeItem>
<!-- Some more markup -->
</jcf:recursionNode>
</jcf:recursion>
Идея состоит в том, что для каждой итерации рекурсии можно определить явную разметку и инструкции. В примере показаны инструкции для первого уровня. Если уровень не определен, инструкции относятся к каждому уровню в рекурсии, для которого еще не определен явный уровень. Nodes
обозначает новые уровни, а NodeItems
представляет все предметы на данном уровне.
Затем родительский компонент на основе Java запускает реальную рекурсию в коде Java и делегирует ее дочерним элементам для рендеринга.
Надеюсь, это поможет вам.