Jsf Primefaces菜单项未触发ActionEvent

Jsf Primefaces菜单项未触发ActionEvent,jsf,jsf-2,primefaces,menu,model,Jsf,Jsf 2,Primefaces,Menu,Model,我对动态创建的菜单模型有问题。我使用的是JSF2.1.28和Primefaces 3.4.5(Primefaces 3.5.25也进行了测试,同样的问题) 我有以下代码: XHTML 动作监听器 public class MenuActionListener implements ActionListener { @Override public void processAction(ActionEvent event) throws AbortProcessingExcept

我对动态创建的菜单模型有问题。我使用的是JSF2.1.28和Primefaces 3.4.5(Primefaces 3.5.25也进行了测试,同样的问题)

我有以下代码:

XHTML

动作监听器

public class MenuActionListener implements ActionListener {

    @Override
    public void processAction(ActionEvent event) throws AbortProcessingException {
        System.out.println("Test");
    }
}
单击菜单项时应激发的操作事件未激发。但是,如果我在SelectOneMenu中选择了一个项目,然后再次单击该菜单项,则事件将被触发。我发现它与SelectOneMenu上的“required”属性有关,因为如果我删除它,一切都会正常工作

这是Primefaces中的错误吗?如果是,是否有解决方法?如果不是bug,有人能告诉我我做错了什么吗?

我找到了解决方案

将所有菜单项的立即属性设置为“true”可以解决此问题

解决这个问题后,我遇到了另一个问题。我得到了一个JSF异常,消息是“不能删除相同的组件两次”。这个问题的解决办法可以在这里找到

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">

    <h:head>
    </h:head>

    <h:body>
        <div id="center">
            <ui:insert name="center">
            </ui:insert>
        </div>
    </h:body>
</html>
@ManagedBean(name = "menuBean")
@SessionScoped
public class MenuBean {

    public MenuModel getMenu() {
        MenuModel menuModel = new DefaultMenuModel();
        MenuItem menuItem = new MenuItem();
        menuItem.setId("testMenuItem");
        menuItem.setTitle("ActionTest");
        menuItem.addActionListener(new MenuActionListener());
        menuModel.addMenuItem(menuItem);
        return menuModel;
    }
}
public class MenuActionListener implements ActionListener {

    @Override
    public void processAction(ActionEvent event) throws AbortProcessingException {
        System.out.println("Test");
    }
}