org.primefaces.component.menubar.MenubarRenderer.encodeSubmenuIcon中的java.lang.NullPointerException

INE*_*ile 5 jsf menubar primefaces commandbutton

我正在使用一个动态菜单栏.当按下命令按钮时,应更新菜单栏的内容.

这是我非常简单的xhtml页面

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>CoSMo</title>
</h:head>
<h:body>
    #{simpleMenuBacking.init()}
    <h:form>
        <p:commandButton value="Submit" action="#{simpleMenuBacking.updateModel()}" update="mb1"/>
        <p:growl id="messages" showDetail="false"/>
        <p:menubar id="mb1" model="#{simpleMenuBacking.model}" />
    </h:form> 

</h:body>
Run Code Online (Sandbox Code Playgroud)

而我的(相应简单)支持bean:

@Named
@SessionScoped
public class SimpleMenuBacking implements Serializable {

    private DefaultMenuModel model;

    public void init() {
    Logger.getLogger(UserBacking.class.getName()).info("[SimpleMenuBacking.init()] Starting.");

        model = new DefaultMenuModel();

        String myMenuEntry = "MENU ENTRY " + new Random().nextInt();
        Logger.getLogger(UserBacking.class.getName()).info(myMenuEntry);
        model.addElement(new DefaultSubMenu(myMenuEntry));
    }

    public SimpleMenuBacking() {
    }

    public DefaultMenuModel getModel() {
         Logger.getLogger(UserBacking.class.getName()).info("[SimpleMenuBacking.getModel()] Starting.");
        return model;
    }

    public void updateModel() {

        Logger.getLogger(UserBacking.class.getName()).info("[SimpleMenuBacking.updateModel()] Starting.");

        String myMenuEntry = "MENU ENTRY " + new Random().nextInt();
        model.addElement(new DefaultSubMenu(myMenuEntry));

        Logger.getLogger(UserBacking.class.getName()).info("[SimpleMenuBacking.updateModel()] Over.");
    }

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我按下命令按钮时,菜单栏模型会更新,但更改不会在菜单栏中呈现.我发现以下异常几乎肯定是导致问题的原因:

SEVERE:   Error Rendering View[/index.xhtml]
java.lang.NullPointerException
at org.primefaces.component.menubar.MenubarRenderer.encodeSubmenuIcon(MenubarRenderer.java:60)
at org.primefaces.component.tieredmenu.TieredMenuRenderer.encodeSubmenu(TieredMenuRenderer.java:161)
at org.primefaces.component.tieredmenu.TieredMenuRenderer.encodeElements(TieredMenuRenderer.java:127)
at org.primefaces.component.tieredmenu.TieredMenuRenderer.encodeMenu(TieredMenuRenderer.java:78)
at org.primefaces.component.menubar.MenubarRenderer.encodeMarkup(MenubarRenderer.java:50)
at org.primefaces.component.menu.BaseMenuRenderer.encodeEnd(BaseMenuRenderer.java:108)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:924)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:559)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
...
Run Code Online (Sandbox Code Playgroud)

这是怎么造成的,我该如何解决?我愿意提供有关我的代码和/或项目设置的更多详细信息.谢谢.

INE*_*ile 7

最后,我想出了问题所在.

本讨论中,解释说,如果DefaultSubMenu对象没有id,则菜单栏的呈现失败.只需为每个DefaultSubMenu对象分配一个id,就完成了.

或者,您可以调用

menuModel.generateUniqueIds();
Run Code Online (Sandbox Code Playgroud)

让模型为您生成唯一的ID.