JSF递归复合组件

6
我有一个递归对象bean结构,它是这样的
主DTO列表 -> 值 -> 主DTO列表
我试图创建一个递归组合组件,其中包含一个输入框和一个带值按钮的组件。我调用同一组件来构建子类型,但它会导致堆栈溢出错误。
我尝试使用渲染属性在包围面板中,基于列表是否为空,但它不起作用。我尝试将对组合组件的调用(从组合组件内部)包装在c:if中,但它也不起作用。
我总是得到StackOverflowError。
如何构建递归组合组件?感谢您的时间!
1个回答

8
我经常遇到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代码中的实际递归并委派给其子项进行渲染。

希望这能使您顺利进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接