CQ5 Java QueryBuilder API

问题描述:

我在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(); 

如果你在一个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

这可以使用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。我尝试了很多东西,但只有你的解决方案只工作:) –