Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 动态菜单项未触发预期的bean方法_Jsf_Primefaces_Menuitem - Fatal编程技术网

Jsf 动态菜单项未触发预期的bean方法

Jsf 动态菜单项未触发预期的bean方法,jsf,primefaces,menuitem,Jsf,Primefaces,Menuitem,我正在开发一个带有p:menuButton的页面,其中动态填充了MenuItem元素。菜单项已成功填充,但问题是,当我单击它们时,预期的bean方法没有被触发。当我尝试使用创建静态菜单项时,预期的方法按预期启动 在我的HXTML上: <h:form id="menuButtonForm" binding="#{taskMenuDefinitionRequestBean.menuButtonForm}"> <p:growl id="messages

我正在开发一个带有p:menuButton的页面,其中动态填充了MenuItem元素。菜单项已成功填充,但问题是,当我单击它们时,预期的bean方法没有被触发。当我尝试使用创建静态菜单项时,预期的方法按预期启动

在我的HXTML上:

<h:form id="menuButtonForm" binding="#{taskMenuDefinitionRequestBean.menuButtonForm}">
                <p:growl id="messages" showDetail="false"/>
                <p:menuButton value="Action" binding="#{customTaskMenuDefinitionBean.menuButton}">
                    <p:menuitem value="Plain Action" action="#{customTaskMenuDefinitionBean.action}"/>
                    <p:menuitem value="Test Action" action="#{customTaskMenuDefinitionBean.testAction('1', '2')}"/>
                </p:menuButton>
            </h:form>
在我的支持bean上:

public TaskMenuDefinitionExtensionPageBean() {
    super();
//some prior logic here
    try {
        List<TaskMenuDefinition> menuList = 
                getTaskMenuDefinitionService().getMenusByTaskStatus(taskCode, 
                        taskStatusCode, Romp2Constants.MENU_BUTTON_ACTN, user);
        if(!menuList.isEmpty()) {
            Iterator iterator = menuList.iterator();
            while(iterator.hasNext()) {
                TaskMenuDefinition taskMenu = (TaskMenuDefinition) iterator.next();

                String expression = //"#{taskMenuDefinitionRequestBean.actionEvent}";
                    String.format("#{taskMenuDefinitionRequestBean.testAction('%s','%s')}", 
                            taskMenu.getNextTaskCode(), taskMenu.getNextTaskStatusCode());

                /*MethodExpression actionExpression = 
                        createMethodExpression(expression, Void.TYPE, new Class[]{ActionEvent.class});
                MethodExpressionActionListener actionListener = 
                        createMethodActionListener(expression, Void.TYPE, new Class[]{ActionEvent.class});*/

                MethodExpression actionExpression = 
                createMethodExpression(expression, Void.TYPE, new Class[]{String.class, String.class});
                    MethodExpressionActionListener actionListener = 
                createMethodActionListener(expression, Void.TYPE, new Class[]{String.class, String.class});

                UIMenuItem menuItem = //new UIMenuItem(); 
                        (UIMenuItem) getApplication().createComponent(UIMenuItem.COMPONENT_TYPE);       
                menuItem.setId(taskMenu.getTaskCode() + "_" + taskMenu.getTaskStatusCode() 
                    + "_" + taskMenu.getId().toString());
                menuItem.setValue(taskMenu.getMenuDisplayTxt());
                menuItem.setActionExpression(actionExpression);
                menuItem.addActionListener(actionListener);
                menuItem.getAttributes().put("taskCode", taskCode);
                log.info("menuItem command: " + menuItem.getCommand());
                log.info("menuItem process: " + menuItem.getProcess());
                log.info("actionExpression.getExpressionString: " + actionExpression.getExpressionString());
                MethodInfo method = actionExpression.getMethodInfo(getELContext());
                if(method != null) {
                    log.info("actionExpression.getExpressionString: " + method.getName());  
                }                   
                //menuItem.setTransient(true);
            }
        }
    } catch (Exception e) {
        log.error("Caught Exception: " + e.getMessage(), e);
    }
}

protected MethodExpression createMethodExpression(String expression, Class<?> returnType, 
    Class<?>[] parameterTypes) {
    return getApplication().getExpressionFactory().createMethodExpression(
            getELContext(), expression, returnType, parameterTypes);
}

protected MethodExpressionActionListener createMethodActionListener(String valueExpression,
        Class<?> expectedReturnType, Class<?>[] expectedParamTypes) {
    MethodExpressionActionListener actionListener = 
            new MethodExpressionActionListener(createMethodExpression(
    valueExpression, expectedReturnType, expectedParamTypes));
    return actionListener;
}

不要在菜单按钮中使用binding属性,而是使用model属性并将其指向org.primefaces.model.menu.MenuModel

    model="#{bean.model}"
在bean中声明

    private MenuModel model;

    public MenuModel getModel() {
         return model;
    }

    public void setUserMenuModel(MenuModel model) {
        this.model = model;
    }
在你的施工后

   model = new DefaultMenuModel();
   DefaultMenuItem item = new DefaultMenuItem("Choose my answer");
   item.setCommand("#{customTaskMenuDefinitionBean.action}");
   item.setParam("Something u want to pass");
   item.setAjax(false);
   item.setTitle("My title");
   //you can either add this directly OPTION 1
   model.addElement(item);
   // or have submenus OPTION 2
   // DefaultSubMenu submenu = new DefaultSubMenu("Upvote me");
   // submenu.setExpanded(false);
   // submenu.setStyleClass("stylemeplease");
   // submenu.addElement(item);
   // model.addElement(submenu);

继续添加任意多个DefaultMenuItem并将其添加到

Hi,请将您的示例作为。。。和发布版本信息