Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf PrimeFaces UIMenuItem对象获取无效ID_Jsf_Primefaces_Jsf 2 - Fatal编程技术网

Jsf PrimeFaces UIMenuItem对象获取无效ID

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

我目前正在进行一项任务,该任务涉及将项目的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.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);
            }
        }
    }
}