Shemil
Shemil

Reputation: 387

Dynamic Menuitem and ActionExpression

My code is like:

<?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>

My managed bean is like:

@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;
    }
}

When running this code when I click on the menu item, the method add() is never executed.

What is the reason?

Upvotes: 1

Views: 5338

Answers (2)

Rafael Camargo
Rafael Camargo

Reputation: 31

You need to change your add() method to return String:

    public String add(){
            //TODO:
    }

And remove this line: item.setUrl("#"); from MenuBean.

Upvotes: 3

maple_shaft
maple_shaft

Reputation: 10463

Which menu item is not calling? In this menu item you set the add method to return a type of String and take no arguments.

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

In this menu item you say that a method add will return VOID and take an Object and String argument.

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

You do not have a method add which matches either of these signatures in your ManagedBean class.

Upvotes: 1

Related Questions