Adobe AEM:从 user.memberOf() 返回的迭代器不允许 Next() 方法
Adobe AEM: Iterator returned from user.memberOf() not allowing Next() method
Java dev 以及 adobe CQ dev 的新手,我现在有点困惑。我正在尝试 return 所有用户及其关联组的格式化 table 使用 UserManager。
一切似乎都已设置并正常工作,但是,当它到达我的 while 循环以遍历由 Authorizable.memberOf() 方法编辑的迭代器 return 时,我收到一个错误。当它到达 Next() 方法时,它 return 是一个错误,说明 "The method Next() is undefined for the type 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
如果有任何不合理的地方或者我没有包含足够的信息,请告诉我。任何帮助将不胜感激。
谢谢。
您应该使用方法 next()
而不是 Next()
(注意小写 'n')
提醒在早期混乱中寻找答案的任何其他新手,我 posted 的代码还有很多其他问题与我询问的问题无关(它使用 Next() 而不是 next())。我现在已经纠正了所有其他问题,下面列出了代码。我犯的其他错误的要点列表:
- adobe AEM 中用户帐户的 UUID 字符串 属性 与需要从apache.jackrabbit界面。
- 尝试使用为群组 ("rep:principalName") 列出的文字 属性 名称,以便在使用 jackrabbit 的群组界面时 return 属性 值是也没有用
- 底线,我确定我在 javax.jcr 和 apache.jackrabbit 接口之间错误地传递信息,但不知道如何正确传递存在于一个接口中的 属性 名称键入另一个
- 但是,我确实想出了一个糟糕的小变通办法,它利用了可以从 AEM (javax.jcr) 的节点接口获得的路径 属性,并且可以作为字符串传递到 getAuthorizableByPath(String path) 的 jackrabbit 接口方法来获取我正在寻找的 Authorizable 对象。
我几乎可以肯定这不是最好的方法,但不知道在接口之间传递属性的正确语法。如果有人能 post 以正确的方式做到这一点,我将不胜感激 :)
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>");
}
Java dev 以及 adobe CQ dev 的新手,我现在有点困惑。我正在尝试 return 所有用户及其关联组的格式化 table 使用 UserManager。
一切似乎都已设置并正常工作,但是,当它到达我的 while 循环以遍历由 Authorizable.memberOf() 方法编辑的迭代器 return 时,我收到一个错误。当它到达 Next() 方法时,它 return 是一个错误,说明 "The method Next() is undefined for the type 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
如果有任何不合理的地方或者我没有包含足够的信息,请告诉我。任何帮助将不胜感激。
谢谢。
您应该使用方法 next()
而不是 Next()
(注意小写 'n')
提醒在早期混乱中寻找答案的任何其他新手,我 posted 的代码还有很多其他问题与我询问的问题无关(它使用 Next() 而不是 next())。我现在已经纠正了所有其他问题,下面列出了代码。我犯的其他错误的要点列表:
- adobe AEM 中用户帐户的 UUID 字符串 属性 与需要从apache.jackrabbit界面。
- 尝试使用为群组 ("rep:principalName") 列出的文字 属性 名称,以便在使用 jackrabbit 的群组界面时 return 属性 值是也没有用
- 底线,我确定我在 javax.jcr 和 apache.jackrabbit 接口之间错误地传递信息,但不知道如何正确传递存在于一个接口中的 属性 名称键入另一个
- 但是,我确实想出了一个糟糕的小变通办法,它利用了可以从 AEM (javax.jcr) 的节点接口获得的路径 属性,并且可以作为字符串传递到 getAuthorizableByPath(String path) 的 jackrabbit 接口方法来获取我正在寻找的 Authorizable 对象。
我几乎可以肯定这不是最好的方法,但不知道在接口之间传递属性的正确语法。如果有人能 post 以正确的方式做到这一点,我将不胜感激 :)
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>"); }