Adobe AEM:Iterator从user.memberOf()返回,不允许使用Next()方法

时间:2016-02-25 23:09:31

标签: java adobe aem jcr

对于Java开发人员以及adobe CQ开发人员来说还是一个新手,我现在有点难过。我试图使用UserManager返回所有用户及其关联的组的格式化表。

所有内容似乎都已设置并正常工作,但是,当它到达我的while循环时,我会收到一个错误,以迭代Authorizable.memberOf()方法返回的迭代器。当它到达Next()方法时,它返回一个错误,声明"方法Next()未定义类型Iterator"。不知道此时该怎么做。任何帮助,将不胜感激。有问题的具体代码部分如下。

while(paths.hasNext()) {  
Node node = paths.nextNode();
String UID = node.getProperty("jcr:uuid").getString();
String usrName = node.getProperty("rep:principalName").getString();
Authorizable usr = usrMgr.getAuthorizable(UID);
Iterator<Group> itrGrp = usr.memberOf();
String grpList = "";
while(itrGrp.hasNext()) {
    Group grp = itrGrp.Next();
    Value[] grpVal = grp.getProperty("rep:principalName");
    String[] grpArr = Arrays.copyOf(grpVal, grpVal.length, String[].class);
    int arrLen = grpArr.Length;
    If (arrLen > 1) {
        for(int i=0; i<arrLen; i++){
            grpList = grpList + grpArr[i] + "<br/>";
        }
    }else{
        grpList = grpList + grpArr[0];
    }
}
out.println("<tr><td>" + usrName + "</td><td>" +grpList + "</td></tr>");

}

此外,以下是我所有导入的界面,以防它适用:

java.util.Iterator,
javax.jcr.query.Query,
javax.jcr.NodeIterator,
javax.jcr.Node,
javax.jcr.PropertyIterator,
javax.jcr.Property,
javax.jcr.Value,
javax.jcr.SimpleCredentials,
javax.jcr.RepositoryFactory,
javax.jcr.Repository,
javax.jcr.Session, 
org.apache.jackrabbit.api.JackrabbitSession,
org.apache.jackrabbit.api.security.user.UserManager,
org.apache.jackrabbit.api.security.user.Authorizable,
org.apache.jackrabbit.api.security.user.Group

如果有什么不合理或者我没有提供足够的信息,请告诉我。任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:0)

您应该使用方法next()代替Next()(请注意小写'n')

答案 1 :(得分:0)

对于在早期的混乱中寻找答案的任何其他新手来说,只是一个头脑,我发布的代码还有一些其他问题与我询问的问题无关(使用Next()而不是next())。我现在已经纠正了所有其他问题,下面列出了代码。我做出的其他错误的子弹点列表:

  • adobe AEM中用户帐户的UUID String属性与需要从apache.jackrabbit接口传递给UserManager.getAuthorizable(ID)方法的ID属性不同。
  • 尝试使用为组列出的文字属性名称(&#34; rep:principalName&#34;)以便在使用jackrabbit的Group接口时返回属性值也没有用处
  • 最重要的是,我知道我错误地在javax.jcr和apache.jackrabbit接口之间传递信息,但不知道如何将一种接口类型中存在的属性名称正确传递给另一种接口
  • 但是,我确实找到了一个蹩脚的小解决方案,它利用了可以从AEM(javax.jcr)的节点接口获得的path属性,并且可以作为字符串传递给getAuthorizableByPath的jackrabbit接口方法( String path)获取我正在寻找的Authorizable对象。
  • 我几乎可以肯定这不是最好的方法,但不知道在接口之间传递属性的正确语法。我绝对会感谢任何能够发布正确方法的人:)

    while(paths.hasNext()) {  
    Node node = paths.nextNode();
    String usrPath = node.getPath();
    Authorizable usr = usrMgr.getAuthorizableByPath(usrPath);
    String usrName = node.getProperty("rep:principalName").getString();
    Iterator<Group> itrGrp = usr.memberOf();
    String grpList = "";
    if (itrGrp.hasNext()){
    while(itrGrp.hasNext()) {
        Group grp = itrGrp.next();
    String grpPath = grp.getPath();
    
    grpList = grpList + grpPath + "</br>";
    }
    }
    out.println("<tr><td>" + usrName + "</td><td>" +grpList + "</td></tr>");
    }