2015-09-03 94 views
0

我为我的一个项目使用了玉兰,并且创建了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

回答

1

没有足够的数据,所以只是胡乱猜测:当管理员执行查询中心,您登录并有权访问节点。在针对REST端点运行时,您尚未登录,匿名用户没有分配访问dinnacoDriven工作区的权限。

HTH,

+0

好吧,是的,这可能是这样,但它不应该抛出一些授权异常,而不是返回查询结果为空的。 – Syed

+0

谢谢@Jan这确实是问题所在。但是这个查询我想以匿名用户身份运行。有两种选择是在管理上下文中执行查询,另一种是向匿名用户添加dinnacoDriven工作区读/写权限(这可以从web上完成,但我希望在安装模块时执行此操作)。你能指出这两个例子吗? – Syed

+0

个人而言,我不会授予匿名写入权限。这只是要求麻烦。最好你想在系统上下文中执行它。至于示例,检查文档或Magnolia论坛,不能想到从我的头顶上的任何链接,但应该像调用MgnlContext.doInSystemContext(new Op(){...})一样简单; – Jan