JCR (JackRabbit) 查询返回空结果

Posted

技术标签:

【中文标题】JCR (JackRabbit) 查询返回空结果【英文标题】:JCR (JackRabbit) Query returning empty results 【发布时间】:2015-09-03 09:02:08 【问题描述】:

我在我的一个项目中使用了 magnolia,并且我创建了一个 REST Endpoint。其余端点将从我的自定义工作区读取节点并将结果返回给客户端。很简单。

如果我在 magnolia JCR Utils 查询应用程序中运行以下查询,它工作正常并返回正确的结果。

SELECT * FROM [mgnl:contentIndex]

下面是截图

http://s1.postimg.org/gl59arw2n/correct_result.png

如果我在我的 REST ENDPOINT 处理程序中运行以下代码,它将返回空结果集。

    // 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, 一月

【讨论】:

好的,是的,可能是这种情况,但它不应该抛出一些授权异常而不是返回空结果集吗? 感谢@Jan 这确实是问题所在。但是这个查询我想以匿名用户身份运行。有两种选择,一种是在管理员上下文中执行查询,另一种是向匿名用户添加 dinnacoDriven 工作区读/写权限(我可以从 Web 执行此操作,但我想在安装模块时执行此操作)。你能指出这两个例子吗? 就个人而言,我不会授予匿名写访问权限。那只是自找麻烦。最好您希望在系统上下文中执行此操作。至于例子,检查文档或 Magnolia 论坛,我想不出任何链接,但应该像调用 MgnlContext.doInSystemContext(new Op() ... ); 一样简单。

以上是关于JCR (JackRabbit) 查询返回空结果的主要内容,如果未能解决你的问题,请参考以下文章

写入 JCR (JackRabbit) [Magnolia] 时出现 AccessDeniedException

JCR 长耳兔分页

将我的 POJO 保存到 Jackrabbit JCR 的最佳方法是啥?

JCR-SQL2过滤查询以仅获取空节点

JCR 基本概念

Jackrabbit Oak Lucine 索引和 SQL2 查询,用于在 txt 和 pdf 中进行全文搜索