Opa,
Voltando aqui pra posta a solução que achei.
Para gerar o menu dinâmico usando o menubar JSF, fiz da seguinte forma:
No xhtml:
<h:form>
<p:menubar model="#{controleMenuMB.menuModel}"/>
</h:form>
No ControleMenuManagedBean:
@ViewScoped
public class ControleMenuManagedBean {
private String url;
private MenuModel menuModel;
@EJB
private ModuloBusinessRemote moduloBusiness;
@EJB
private PaginaBusinessRemote paginaBusiness;
@PostConstruct
public void init() {
this.geraListaModulos();
}
public MenuModel geraListaModulos() {
this.menuModel = new DefaultMenuModel();
Submenu submenu;
MenuItem item;
try {
for (Modulo modulo : this.moduloBusiness.listar()) {
submenu = new Submenu();
submenu.setLabel(modulo.getNome());
for (Pagina pagina : this.paginaBusiness.listar()) {
if (pagina.getModulo().getId().equals(modulo.getId())) {
item = new MenuItem();
item.setValue(pagina.getNome());
item.setAjax(false);
item.setActionExpression(this.createExpression("#{controleMenuMB.getItemMenuSelecionado}", String.class, null));
item.addActionListener(this.createPropertyActionListener("#{controleMenuMB.url}", pagina.getUrl()));
submenu.getChildren().add(item);
}
}
this.menuModel.addSubmenu(submenu);
}
} catch (Exception e) {
e.printStackTrace();
}
return this.menuModel;
}
public void getItemMenuSelecionado() {
System.out.println("Entro no getMenu");
FacesContext facesContext = FacesContext.getCurrentInstance();
String url = this.getUrl();
System.out.println("URL: " + url);
}
private MethodExpression createExpression(final String expression, final Class<?> returnType, final Class<?>[] parameters) {
FacesContext facesContext = FacesContext.getCurrentInstance();
Application application = facesContext.getApplication();
ExpressionFactory expressionFactory = application.getExpressionFactory();
ELContext elContext = facesContext.getELContext();
return expressionFactory.createMethodExpression(elContext, expression, returnType, parameters);
}
private ValueExpression createValueExpression(final String expression, final Class<?> expectedType) {
final ExpressionFactory expressionFactory;
final ELContext elContext;
FacesContext facesContext = FacesContext.getCurrentInstance();
expressionFactory = facesContext.getApplication().getExpressionFactory();
elContext = facesContext.getELContext();
return expressionFactory.createValueExpression(elContext, expression, expectedType);
}
public MenuModel getMenuModel() {
return menuModel;
}
private SetPropertyActionListenerImpl createPropertyActionListener(final String expression, final Object value) {
final ExpressionFactory expressionFactory;
FacesContext facesContext = FacesContext.getCurrentInstance();
expressionFactory = facesContext.getApplication().getExpressionFactory();
return new SetPropertyActionListenerImpl(createValueExpression(expression, value.getClass()), expressionFactory.createValueExpression(value, value.getClass()));
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
Basicamente, eu fiz da seguinte forma:
Criei um private MenuModel menuModel; e criei seus getters e setters.
Criei um método init anotado com @PostConstruct e nesse método, chamo o método geraListaModulos()
Nesse método eu percorro uma lista com os módulos e adiciono a um submenu.
Depois percorro uma lista de paginas e jogo a um menuItem, mas só pego as páginas que pertecem a esse módulo.
Depois jogo esse menuItem no subMenu.
O que eu estava errando, é que quando coloco item.setUrl(), ele gerava um erro.
Então, basicamente, tem que tirar esse setUrl e criar propertyActionListener passando a variavel url como parâmetro.
Além do propertyActionListener, também crio um action chamado getItemMenuSelecionado().
Nesse getItemMenuSelecionado() eu pego a url que foi passada na propertyActionListener e ai manipulo do jeito que preciso.
O banco de dados é simples, seria:
Módulo { ID, NOME}
Página {ID, NOME, URL, MODULO_ID}
Valeu pela ajuda pessoal.
Abraços.