我为我的一个项目使用了玉兰,并且创建了REST端点。其余端点将从我的自定义工作区中读取节点并将结果返回给客户端。这很简单。JCR(JackRabbit)查询返回空结果
如果我在magnolia JCR Utils查询应用程序中运行以下查询,它工作正常,并返回正确的结果。
SELECT * FROM [mgnl:contentIndex]
下面是截图
http://s1.postimg.org/gl59arw2n/correct_result.png
如果我在REST端点处理程序运行下面的代码它返回空的结果集。
// Get JCR session for "dinnacoDriven" workspace
try {
Session session = MgnlContext.getJCRSession("dinnacoDriven");
StringBuilder queryBuilder = new StringBuilder("SELECT * FROM [mgnl:contentIndex]");
System.out.println(queryBuilder.toString());
Query query = session.getWorkspace().getQueryManager().createQuery(queryBuilder.toString(), Query.JCR_SQL2);
List<String> suggestions = new ArrayList<String>();
NodeIterator iterator = query.execute().getNodes();
while(iterator.hasNext()) {
System.out.println("next node");
Node node = iterator.nextNode();
suggestions.add(node.getProperty("title").getString());
}
return suggestions;
} catch(RepositoryException ex) {
throw new ServiceException("Internal Server Error", ex);
}
我可以在System.out.println(queryString.toString());
将打印,我上面运行,但next node
永远不会印刷完全相同的查询日志中看到。它返回空结果。
自从我试图弄清楚这段代码出了什么问题以来,已经有12个小时了,但是我找不到任何东西。
我的代码有什么问题?为什么它返回空结果集?编辑: 添加一些额外的信息。 当我从代码访问时,我没有登录。我正在匿名访问。
contentIndex节点存储在根节点contentIndex下的dinnacoDriven工作区中。
一些更多的信息,我导出dinnacoDriven工作区转换成XML,这是XML文件
https://gist.github.com/riteshsangwan/efe93ee4c5077236c0c0
好吧,是的,这可能是这样,但它不应该抛出一些授权异常,而不是返回查询结果为空的。 – Syed
谢谢@Jan这确实是问题所在。但是这个查询我想以匿名用户身份运行。有两种选择是在管理上下文中执行查询,另一种是向匿名用户添加dinnacoDriven工作区读/写权限(这可以从web上完成,但我希望在安装模块时执行此操作)。你能指出这两个例子吗? – Syed
个人而言,我不会授予匿名写入权限。这只是要求麻烦。最好你想在系统上下文中执行它。至于示例,检查文档或Magnolia论坛,不能想到从我的头顶上的任何链接,但应该像调用MgnlContext.doInSystemContext(new Op(){...})一样简单; – Jan