JSF Рекурсивный Композитный Компонент - PullRequest
5 голосов
/ 07 августа 2011

У меня есть структура рекурсивного объекта EJB, которая похожа на

список Master DTO -> значение -> список Master DTO

Я пытаюсь создать рекурсивный составной компонент с однимвведите текст и кнопку со значением, привязанным к полю значения.Я вызываю тот же компонент для создания подтипов, но он дает мне ошибку переполнения стека.

Я попытался с визуализированным атрибутом на охватывающей панели, основываясь на том, что список пуст, но он не работает.Я пытался обернуть вызов составного компонента (из составного компонента) в c: если, но он не работает.

Я всегда получаю StackOverflowError.

Любая помощь о том, как построить рекурсивныйсоставные компоненты будут помогать.Спасибо за ваше время!

1 Ответ

7 голосов
/ 07 августа 2011

Я всегда получаю 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 и делегирует ее дочерним элементам для рендеринга.

Надеюсь, это поможет вам.

...