有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java复合组件递归传递支持bean

我试着用复合组件创建一个递归菜单,但我不知道如何将backingbean传递到同一个复合组件中。mi代码如下所示

<composite:interface>
     <composite:attribute name="bean" required="true"/>
     <composite:attribute name="node" required="true"/>
</composite:interface>

<cc:implementation>
     <--some code here-->

     <c:if test="#{not empty cc.attrs.bean.obtainsubmenu(cc.attrs.node)}">
          <c:foreach items="cc.attrs.bean.obtainsubmenu(cc.attrs.node)" var="submenu">
               <!--some other code here-->
               <menu:recursivemenu
                   bean="#{cc.attrs.bean}"
                   node="#{submenu.idOpc}"
               />
          </c:foreach>    
     </c:if>
</cc:implementation>

method Acquisite子菜单仅返回对象列表。该方法如下所示

public List<myObject> obtainsubmenu(Long id){
 return mymap.get(id); //where my maps is parametized  this way Map<Long, List<MyObject>
}

对于我菜单的第一级,它看起来工作得很好。问题是,当它试图调用自己来执行递归时,它没有像应该的那样传递对象引用,并且我得到了一个stackoverflow异常原因,因为映射为null

有没有办法做到这一点

坦克求救


共 (1) 个答案

  1. # 1 楼答案

    首先,不应该使用JSTL标记,而应该使用JSF标记

    空支票也应该是不必要的

    <composite:interface>
         <composite:attribute name="bean" required="true"/>
         <composite:attribute name="node" required="true"/>
    </composite:interface>
    
    <cc:implementation>
         < some code here >
    
        <ui:repeat value="#{cc.attrs.bean.obtainsubmenu(cc.attrs.node)}" var="submenu">
            <! some other code here >
            <menu:recursivemenu bean="#{cc.attrs.bean}" node="#{submenu.idOpc}"/>
        </ui:repeat>    
    </cc:implementation>
    

    但是,如果您正在创建Primefaces菜单,此方法将不起作用。您必须在MenuModel中构建编程菜单

    更一般地说,如果菜单根组件负责呈现其子组件本身(menuComponent.getRendersChildren()返回true),这种方法将不起作用