Динамический Menuitem и ActionExpression - PullRequest
1 голос
/ 23 января 2012

Мой код выглядит так:

<?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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<title>Facelet Title</title>
</h:head>

<f:view contentType="text/html">
<h:body>
    <h:form>
        <p:menu model="#{menuBean.model}"/>
    </h:form>
</h:body>
</f:view>
</html>

Мой управляемый компонент выглядит так:

@ManagedBean   
@RequestScoped
public class MenuBean {

    private MenuModel model;

    public MenuBean() {
        FacesContext facesCtx = FacesContext.getCurrentInstance();
        ELContext elCtx = facesCtx.getELContext();
        ExpressionFactory expFact = facesCtx.getApplication().getExpressionFactory();

        model = new DefaultMenuModel();

        Submenu submenu = new Submenu();
        submenu.setLabel("Dynamic Submenu 1");

        MenuItem item = new MenuItem();
        item.setValue("Dynamic Menuitem 1.1");
        item.setAjax(false);
        item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", String.class, new Class[0]));
        item.setUrl("#");

        submenu.getChildren().add(item);

        model.addSubmenu(submenu);

        submenu = new Submenu();
        submenu.setLabel("Dynamic Submenu 2");
        item = new MenuItem();
        item.setValue("Dynamic Menuitem 2.1");
        item.setAjax(false);
        item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", String.class, new Class[0]));
        item.setUrl("#");

        submenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Dynamic Menuitem 2.2");
        item.setAjax(false);
        item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}",Void.class, new Class[]{Object.class,String.class}));
        item.setUrl("#");
        submenu.getChildren().add(item);

        model.addSubmenu(submenu);
    }

    public MenuModel getModel() {
        return model;
    }

    public String add(Object obj,String nodeId) {
        return null;
    }
}

При запуске этого кода, когда я нажимаю на элемент меню, метод add()никогда не выполняется.

В чем причина?

Ответы [ 2 ]

3 голосов
/ 26 октября 2012

Вам нужно изменить add() метод для возврата String:

    public String add(){
            //TODO:
    }

И удалите эту строку: item.setUrl("#"); из MenuBean.

1 голос
/ 23 января 2012

Какой пункт меню не вызывает?В этом пункте меню вы устанавливаете метод add, чтобы он возвращал тип String и не принимал аргументов.

 item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", String.class, new Class[0]));

В этом пункте меню вы говорите, что метод add вернет VOID и примет аргумент Object и String.

 item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", Void.class, new Class[]{Object.class,String.class}));

У вас нет метода add, который соответствует ни одной из этих подписей в вашем классе ManagedBean.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...