【发布时间】:2017-08-28 19:53:28
【问题描述】:
我正在使用 Primefaces 和 JSF 2.2 开发一个动态菜单。
问题在于它没有插入菜单 ID。查看 primefaces 的代码,它遇到的代码总是错误的:
BaseMenuRenderer:
protected boolean shouldRenderId(MenuElement element) {
if(element instanceof UIComponent)
return shouldWriteId((UIComponent) element);
else
return false;
}
TieredMenuRenderer:
writer.startElement("li", null);
if(shouldRenderId(submenu)) {
writer.writeAttribute("id", submenu.getClientId(), null);
}
所以,我决定重写 primefaces 的 TieredMenuRenderer,但调用了我的重写构造函数类,但从未调用过重写方法。
这是我设置 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>
我的覆盖类:
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 :
遍历渲染器套件,当我执行以下命令时,返回正确的渲染器类型org.primefaces.component.TieredMenuRenderer
Iterator<String> renderKit = kit.getRendererTypes("org.primefaces.component");
当我执行以下代码时,返回我的合格类名ui.jsf.TieredMenuRenderer@64baec0e:
Renderer renderer = kit.getRenderer("org.primefaces.component", "org.primefaces.component.TieredMenuRenderer");
【问题讨论】:
-
“ui.jsf.TieredMenuRenderer”包是否与您的课程包匹配?另外,您的方法的方法签名是否完全匹配?
-
是的。我的班级我使用 Eclipse IDE 中的“复制限定名”。以及我使用自动完成来覆盖的方法。
-
啊,我想我刚刚注意到你的渲染器类型类名和你正在扩展的类名,不匹配包。在 facesconfig.xml 中,您的包路径中缺少“.tieredmenu”。
-
在我以这种方式找到的所有示例中。另外,我从 primefaces 的 faces-config.xml 本身复制了这个渲染器类型。不过我会试一试...
-
在为您的菜单调用
javax.faces.component.UIComponentBase.getRenderer(FacesContext)时检查实际使用的渲染器。
标签: primefaces jsf-2