覆盖 Primefaces 渲染器

Override Primefaces Renderer

我正在使用 Primefaces 和 JSF 2.2 开发动态菜单。

问题是它没有插入菜单 ID。查看 primefaces 的代码,它命中了一个永远为假的代码:

基础菜单渲染器:

protected boolean shouldRenderId(MenuElement element) {
    if(element instanceof UIComponent)
        return shouldWriteId((UIComponent) element);
    else
        return false;
}

分层菜单渲染器:

 writer.startElement("li", null);
                    if(shouldRenderId(submenu)) {
                        writer.writeAttribute("id", submenu.getClientId(), null);
                    }

所以,我决定重写 primefaces 的 TieredMenuRenderer,但是我的重写构造函数 classe 被调用但重写方法从未被调用。

这是我设置 facesconfig.xml

的方式
<render-kit>
        <renderer>
            <component-family>org.primefaces.component</component-family>
            <renderer-type>org.primefaces.component.TieredMenuRenderer</renderer-type>
            <renderer-class>ui.jsf.TieredMenuRenderer</renderer-class>
        </renderer>
    </render-kit>

我的覆盖 class:

    public class TieredMenuRenderer extends org.primefaces.component.tieredmenu.TieredMenuRenderer {
  @Override
    protected void encodeElements(FacesContext context, AbstractMenu menu, List<MenuElement> elements) throws IOException {
        System.out.println("----------- TEST --------------");
        super.encodeElements(context, menu, elements);
    }

Sysout 从不打印。

有谁知道我做错了什么?

谢谢!

编辑:

将 ID 添加到 DefaultMenuItem:

  DefaultMenuItem item = new DefaultMenuItem();
  item.setId(menuItem.getMenuId());// just return a string value.

添加菜单 xhtml,"menucontroller.model" 是一个 primefaces MenuModel,我使用 DefaultMenuModel :

遍历渲染器套件,当我执行以下命令时,returns 正确的渲染器类型 org.primefaces.component.TieredMenuRenderer

Iterator<String> renderKit = kit.getRendererTypes("org.primefaces.component");

当我执行下面的代码时 returns 我的限定 classname ui.jsf.TieredMenuRenderer@64baec0e:

Renderer renderer = kit.getRenderer("org.primefaces.component", "org.primefaces.component.TieredMenuRenderer");

首先,我的渲染器没有覆盖正确的渲染器。当我应该覆盖 org.primefaces.component.MenubarRenderer 时,我覆盖了 org.primefaces.component.tieredmenu.TieredMenuRenderer

然后,为了更正 primefaces id 问题,我在渲染的 class 中执行了以下操作:

 @Override
    protected boolean shouldRenderId(MenuElement element) {
        return true;
    }

@Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        AbstractMenu menu = (AbstractMenu) component;
        encodeMarkup(context, menu);
        encodeScript(context, menu);
    }

EncodedEnd 正在从覆盖我 ID 的 primefaces 调用 "generateIds()"。

完全呈现 class:

import java.io.IOException;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import org.primefaces.component.menu.AbstractMenu;
import org.primefaces.model.menu.MenuElement;

public class MenuRenderer extends org.primefaces.component.menubar.MenubarRenderer {

    @Override
    protected boolean shouldRenderId(MenuElement element) {
        return true;
    }

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        AbstractMenu menu = (AbstractMenu) component;
        encodeMarkup(context, menu);
        encodeScript(context, menu);
    }

}