动态 p:menu 适用于 PrimeFaces 3.5,不适用于 >4.0

Dynamic p:menu works in PrimeFaces 3.5, not in >4.0

我正在将一个项目从 Primefaces 3.5 更新到 4.0,我遇到了菜单问题。 我不明白如何动态创建一个像这样的简单菜单:

<p:menu>
    <p:submenu>
        <p:menuitem value="jump" action="myTransition" />
    </p:submenu>
</p:menu>

我尝试使用在我的 Spring 网络流配置中定义的转换名称来设置项目的命令,但没有结果。

DefaultMenuItem itemNone = new DefaultMenuItem();
item.setCommand("myTransition");

普通菜单工作正常,但如果我尝试动态菜单,页面只会刷新,没有错误或其他证据。

所以,基本上我需要移植这段代码,从 pf 3.5 到 pf >4.0

for(String elem : list)
{
    MenuItem item = new MenuItem();
    item.setValue(elem.toUpperCase());
    item.setActionExpression(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(),  elem.replaceAll("\s","").replace(".", ""),
                String.class, new Class[]{String.class}));
    submenu.getChildren().add(item);
}

有这个功能

public static MethodExpression createMethodExpressionInUIContext(final FacesContext facesContext, final String expression, Class<?> class1, Class[] classes) {

    FaceletContext faceletElContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
    MethodExpression methodExpression = FacesContext.getCurrentInstance().getApplication().getExpressionFactory()
            .createMethodExpression(faceletElContext, expression, class1, classes);

    return methodExpression;
}

我的尝试

DefaultMenuItem item = new DefaultMenuItem();    
item.setCommand(elem);

item.setCommand(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(),  elem.replaceAll("\s","").replace(".", ""),String.class, new Class[]{String.class}).getExpressionString());

没用

就我自己而言,从过去开始,为了实现我的目标,我遵循了以下步骤:

  • 注册我自己的扩展 Primefaces 版本的 Menu 和 MenuRenderer
  • 为操作命令(名为 commandAction)定义一个带有附加字段的新 MenuItem
  • 将解码方法重写为:

MenuRenderer

@Override
public void decode(FacesContext context, UIComponent component) {
    AbstractMenu menu = (AbstractMenu) component;
    String clientId = menu.getClientId(context);
    Map<String, String> params = context.getExternalContext().getRequestParameterMap();

    if (params.containsKey(clientId)) {
        String menuid = params.get(clientId + "_menuid");
        DefaultMenuItem menuitem = (DefaultMenuItem) findMenuitem(menu.getElements(), menuid);
        MenuActionEvent event = new MenuActionEvent(menuitem, menuitem);

        // Action Listener
        if (StringUtils.isNoneBlank(menuitem.getCommand())) {
            menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
                    FacesContext.getCurrentInstance(), menuitem.getCommand().replaceAll("\s", "").replace(".", ""),
                    String.class, new Class[] { String.class }));

            if (menuitem.isImmediate()) {
                event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
            } else {
                event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            }
            menu.queueEvent(event);
        }

        // Action
        if (StringUtils.isNoneBlank(menuitem.getCommandAction())) {
            menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
                    FacesContext.getCurrentInstance(), menuitem.getCommandAction().replaceAll("\s", "").replace(".", ""),
                    String.class, new Class[] { String.class }));

            if (menuitem.isImmediate()) {
                event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
            } else {
                event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            }
            menu.queueEvent(event);
        }
    }
}