2015-09-03 117 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