2014-01-10 54 views
0

我在Adobe API文檔中看到了QueryBuilder服務,它可以通過URL調用許多查詢選項,這將返回基於JSON的響應。很好。我想在java API中使用它。我發現了一些例子,並在eclipse中嘗試過,但有些東西我不知道如何獲得服務「sling」,如下面的代碼所示:或換句話說,如何製作QueryBuilder Java對象。CQ5 Java QueryBuilder API

任何特定的JAR我需要或我需要在我的PC上安裝Apache SLING我不確定任何人可以分享這將是有益的,因爲我是CQ5的新手,並不知道。

的示例代碼如下:

 Repository repository = JcrUtils.getRepository(SERVER); 
     SimpleCredentials credentials = new SimpleCredentials(USERNAME, PASSWORD.toCharArray()); 
     Session session = repository.login(credentials); 
     System.out.println("got session: " + session); 

     /*HERE SLING IS THE PROBLEM HOW TO GET SLING */ 
     QueryBuilder qbuilder = sling.getService(QueryBuilder.class); 
     String fulltextSearchTerm = "Geometrixx"; 

     // create query description as hash map (simplest way, same as form 
     // post) 
     Map<String, String> map = new HashMap<String, String>(); 

     // create query description as hash map (simplest way, same as form 
     // post) 
     map.put("path", "/content"); 
     map.put("type", "cq:Page"); 
     map.put("group.p.or", "true"); // combine this group with OR 
     map.put("group.1_fulltext", fulltextSearchTerm); 
     map.put("group.1_fulltext.relPath", "jcr:content"); 
     map.put("group.2_fulltext", fulltextSearchTerm); 
     map.put("group.2_fulltext.relPath", "jcr:content/@cq:tags"); 

     // can be done in map or with Query methods 
     map.put("p.offset", "0"); // same as query.setStart(0) below 
     map.put("p.limit", "20"); // same as query.setHitsPerPage(20) below 

     Query query = qbuilder.createQuery(PredicateGroup.create(map), session); 
     query.setStart(0); 
     query.setHitsPerPage(20); 

     SearchResult result = query.getResult(); 

回答

1

如果你在一個Java類的工作,而不是一個JSP,您可以使用@Reference註釋做一個給定服務的查詢 - 這將找到由OSGi註冊的匹配服務並將其實施返回給您。

Felix SCR documentation

的@Reference註釋定義到其他服務的引用由服務組件運行時做出 可用的組件。

你的代碼變得簡單:

@Reference 
QueryBuilder qbuilder; 
+0

感謝的答案,但依然QueryBuilder的是空在運行時。我有一個main()方法的簡單類。我已經在構建路徑中添加了Flix Annotation Jar。 CQ5服務器在本地運行。 – zaxeer

+0

@zaxeer在部署到您的CQ實例或獨立類中時,您是否運行此代碼?如果不在OSGi容器中,您將無法使用'getService'或'@ Reference' - 這是Felix在每種情況下都提供的服務。 – anotherdave

+0

我正在運行代碼作爲獨立的Java應用程序,我的Java應用程序解析JCR樹,但新的要求是在內容中搜索。 – zaxeer

1

這可以使用Adobe CQ OSGi的魔法來實現...添加在您的類來保存ComponentContext的私人領域。

private ComponentContext context; 

落實激活方法:

protected void activate(ComponentContext context) { 
    this.context = context; 
} 

然後你可以用這方面取得的QueryBuilder:

ServiceReference queryBuilderReference = context.getBundleContext().getServiceReference(QueryBuilder.class.getName()); 
QueryBuilder queryBuilder = (QueryBuilder) context.getBundleContext().getService(queryBuilderReference); 
+0

謝謝@Calahad。我嘗試了很多東西,但只有你的解決方案只工作:) –