Jsf PrimeFaces UIMenuItem对象获取无效ID
我目前正在进行一项任务,该任务涉及将项目的PrimeFaces库从PrimeFaces 3.2更新到6.0 从3.5版到4.0版,有一个版本不向后兼容 我正在处理的代码使用了类Jsf PrimeFaces UIMenuItem对象获取无效ID,jsf,primefaces,jsf-2,Jsf,Primefaces,Jsf 2,我目前正在进行一项任务,该任务涉及将项目的PrimeFaces库从PrimeFaces 3.2更新到6.0 从3.5版到4.0版,有一个版本不向后兼容 我正在处理的代码使用了类org.primefaces.component.menuitem.menuitem,它扩展了javax.faces.component.UICommand 从PrimeFaces 4.0开始,org.PrimeFaces.component.menuitem.menuitem是一个接口,有一个新类org.PrimeFac
org.primefaces.component.menuitem.menuitem
,它扩展了javax.faces.component.UICommand
从PrimeFaces 4.0开始,org.PrimeFaces.component.menuitem.menuitem
是一个接口,有一个新类org.PrimeFaces.component.menuitem.UIMenuItem
,它实现了该接口并扩展了javax.faces.component.UICommand
。新的UIMenuItem
类与旧的MenuItem
类具有大致相同的接口,至少它支持我正在处理的代码中使用的所有方法
显然,我更改了MenuItem
对象的初始化代码,以利用新的UIMenuItem
类。这样,代码编译时不会出错,但在运行时失败,出现以下异常:
Dec 01, 2016 11:58:02 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalArgumentException: 0
at javax.faces.component.UIComponentBase.validateId(UIComponentBase.java:542)
at javax.faces.component.UIComponentBase.setId(UIComponentBase.java:363)
在调试器中,我可以看到实际上存在id为0
的UIMenuItem
对象
UIMenuItem
对象都是由工厂方法创建的,如下所示:
public static MenuItem createNavigationMenuItem() {
UIMenuItem item = new UIMenuItem();
item.setStyle("padding: 0;");
item.setUpdate(":tableForm,:navForm");
item.addActionListener(actionListener);
return item;
}
事情是这样的。这些UIMenuItem
对象的ID由以下代码设置:
可以清楚地看到,以数字开头的ID总是会导致IllegalArgumentException
,而这正是我的代码失败的地方
现在我想知道:为什么PrimeFaces库中的代码会给MenuElement
对象提供明显无效的ID(根据它构建的JSF代码)
接下来,我确信PrimeFaces代码是很好的,我的困惑是因为我缺乏理解。但是,
BaseMenuModel
中的代码对我来说毫无意义。有没有人能帮我找出我没有得到的是什么?你不能将MenuModel与UIMenuItems混合:你不能将MenuModel与UIMenuItems混合:不确定是否相关,但我认为你应该创建'DefaultMenuItem'Hi Kukeltje,谢谢你的评论!问题是,我正在处理的代码调用MenuItem
上的getAttributes()
,它是UIMenuItem
通过扩展UICommand
继承的,但是DefaultMenuItem
没有…不确定它是否相关,但我认为您应该创建'DefaultMenuItem'Hi Kukeltje,谢谢您的评论!问题是,我正在处理的代码<代码> > GoestAdvestor(<代码> > < MenuItem > <代码> > <代码> uimunuTube <代码>继承了<代码> UICOMMand 。但是<代码> Debug菜单项并没有对一个问题提出错误的引用:标题是“P:Link不考虑F:PARAM标签”一个问题的不正确引用:标题是“P:Link不考虑F:PARAM标签”
public void generateUniqueIds() {
this.generateUniqueIds(getElements(), null);
}
private void generateUniqueIds(List<MenuElement> elements, String seed) {
if(elements == null || elements.isEmpty()) {
return;
}
int counter = 0;
for(MenuElement element : elements) {
String id = (seed == null) ? String.valueOf(counter++) : seed + ID_SEPARATOR + counter++;
element.setId(id);
if(element instanceof MenuGroup) {
generateUniqueIds(((MenuGroup) element).getElements(), id);
}
}
}
private static void validateId(String id) {
if (id == null) {
return;
}
int n = id.length();
if (n < 1) {
throw new IllegalArgumentException("Empty id attribute is not allowed");
}
for (int i = 0; i < n; i++) {
char c = id.charAt(i);
if (i == 0) {
if (!Character.isLetter(c) && (c != '_')) {
throw new IllegalArgumentException(id);
}
} else {
if (!Character.isLetter(c) &&
!Character.isDigit(c) &&
(c != '-') && (c != '_')) {
throw new IllegalArgumentException(id);
}
}
}
}