Reputation: 387
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
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
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