CQ5 Java QueryBuilder API

时间:2014-01-10 09:19:28

标签: java cq5 sling

我在adobe API文档中看到了QueryBuilder服务,可以通过URL调用许多查询选项,这会返回基于JSON的响应。很好。我想在java API中使用它。我已经找到了一些例子并在eclipse中尝试了但有些事情我不知道如何获得服务“吊索”,如下面给出的代码:或者换句话说如何创建一个QueryBuilder Java对象。

我需要的任何特定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();

2 个答案:

答案 0 :(得分:1)

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

来自Felix SCR documentation

  

@Reference注释定义了对其他服务的引用   服务组件运行时可用于组件。

您的代码变得简单:

@Reference
QueryBuilder qbuilder;

答案 1 :(得分:1)

这可以使用adobe cq 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);