CQ5 Java QueryBuilder API

CQ5 Java QueryBuilder API,java,aem,sling,Java,Aem,Sling,我在AdobeAPI文档QueryBuilder服务中看到过,它可以通过URL调用许多查询选项,返回基于JSON的响应。很好。我想在JavaAPI中使用它。我在eclipse中找到了一些示例并进行了尝试,但我不知道如何获得下面给定代码中的服务“sling”:或者换句话说,如何生成QueryBuilderJava对象 我需要任何特定的JAR,或者我需要在我的PC上安装ApacheSling,我不确定是否有人可以分享这一点,因为我是CQ5新手,也不知道 示例代码如下所示: Repos

我在AdobeAPI文档QueryBuilder服务中看到过,它可以通过URL调用许多查询选项,返回基于JSON的响应。很好。我想在JavaAPI中使用它。我在eclipse中找到了一些示例并进行了尝试,但我不知道如何获得下面给定代码中的服务“sling”:或者换句话说,如何生成QueryBuilderJava对象

我需要任何特定的JAR,或者我需要在我的PC上安装ApacheSling,我不确定是否有人可以分享这一点,因为我是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();
Repository Repository=JcrUtils.getRepository(服务器);
SimpleCredentials credentials=新的SimpleCredentials(用户名、密码.toCharray());
会话=repository.login(凭证);
System.out.println(“got session:+session”);
/*这里的问题是如何获得吊索*/
QueryBuilder qbuilder=sling.getService(QueryBuilder.class);
字符串fulltextSearchTerm=“geometricxx”;
//将查询描述创建为哈希映射(最简单的方法,与表单相同
//(邮政)
Map Map=newhashmap();
//将查询描述创建为哈希映射(最简单的方法,与表单相同
//(邮政)
map.put(“路径”,“内容”);
地图放置(“类型”,“cq:页面”);
map.put(“group.p.or”、“true”);//将此组与或组合
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”);
//可以在映射中完成,也可以使用查询方法完成
映射放置(“p.offset”,“0”);//与下面的query.setStart(0)相同
映射放置(“p.limit”,“20”);//与下面的query.setHitsPerPage(20)相同
Query Query=qbuilder.createQuery(PredicateGroup.create(map),session);
query.setStart(0);
查询.setHitsPerPage(20);
SearchResult=query.getResult();

如果您使用的是Java类而不是JSP,则可以使用
@Reference
注释来查找给定的服务-这将找到OSGi注册的匹配服务,并将其实现返回给您

从:

@Reference注释定义了对其他服务的引用 由服务组件运行时提供给组件

然后,您的代码变得简单:

@Reference
QueryBuilder qbuilder;

这可以通过使用AdobeCQ osgi magic实现……在类中添加一个私有字段来保存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);

感谢您的回答,但QueryBuilder在运行时仍然为空。我有一个带有main()方法的简单类。我在构建路径中添加了Flix注释Jar。CQ5服务器正在本地运行。@Zaxer部署到CQ实例时,您是在运行此代码,还是作为独立类运行?如果不在OSGi容器中,您将无法使用
getService
@Reference
——在每种情况下都是Felix提供服务。我以独立java应用程序的形式运行代码,我的java应用程序解析JCR树,但新的要求是在内容中搜索,QueryBuilder没有公开公共构造函数&它提到“所有示例都假设
QueryBuilder
作为OSGi SCR引用可用。”你可以使用反射来创建一个实例,不过我想说,如果在CQ之外使用它,你肯定会看到一个不受支持的场景。是的,我知道了:谢谢你的帮助谢谢@Calahad。我尝试了很多方法,但只有你的解决方案有效:)