【问题标题】:CQ5 Java QueryBuilder APICQ5 Java QueryBuilder API
【发布时间】:2014-01-10 09:19:27
【问题描述】:

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

【问题讨论】:

    标签: java aem sling


    【解决方案1】:

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

    来自Felix SCR documentation

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

    然后你的代码就变得简单了:

    @Reference
    QueryBuilder qbuilder;
    

    【讨论】:

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

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

    【讨论】:

    • 谢谢@Calahad。我尝试了很多东西,但只有你的解决方案才有效:)
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多