8

我一直在寻找使用 Apache Directory API 执行分页搜索的信息,但我没有找到任何示例或任何关于如何使用适当的 PagedResults 控件构建 SearchRequest 然后执行搜索的信息。

大家有什么秘诀吗?或者知道在哪里可以找到这些信息?

或者,也许您应该推荐我使用其他一些 API,例如 unboundid sdk

在此先感谢和亲切的问候。

4

3 回答 3

9

今天,我努力制作 kayyagara 中的链接示例。

它有一些问题:

  • 需要一个特殊的系统变量来完成这项工作
  • 坏饼干破坏了整个事情
  • 不需要一些设置/代码行

以下是工作示例:

        //Without this you get a class Cast Exception:
        //java.lang.ClassCastException: org.apache.directory.api.ldap.codec.BasicControlDecorator cannot be cast to org.apache.directory.api.ldap.model.message.controls.PagedResults
        System.setProperty(StandaloneLdapApiService.CONTROLS_LIST,
            PagedResultsFactory.class.getName());

        PagedResults pagedSearchControl = new PagedResultsDecorator(
                connection.getCodecService());
        pagedSearchControl.setSize(300);

        // Loop over all the elements
        List<Entry> results = new ArrayList<Entry>();
        boolean hasUnwillingToPerform = false;

        //inspired by http://markmail.org/message/43qjepg6shvfvqud
        while (true) {
            EntryCursor cursor = null;

            try {
                SearchRequest searchRequest = new SearchRequestImpl();
                searchRequest.setBase(new Dn(searchRoot));
                searchRequest.setFilter(searchFilter);
                searchRequest.setScope(SearchScope.SUBTREE);
                searchRequest.addAttributes("*");
                searchRequest.addControl(pagedSearchControl);

                cursor = new EntryCursorImpl(
                        connection.search(searchRequest));

                while (cursor.next()) {
                    Entry result = cursor.get();
                    results.add(result);
                }

                SearchResultDone result = cursor.getSearchResultDone();
                pagedSearchControl = (PagedResults) result
                        .getControl(PagedResults.OID);

                if (result.getLdapResult().getResultCode() == ResultCodeEnum.UNWILLING_TO_PERFORM) {
                    hasUnwillingToPerform = true;
                    break;
                }
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }

            // check if this is over
            byte[] cookie = pagedSearchControl.getCookie();

            if (Strings.isEmpty(cookie)) {
                // If so, exit the loop
                break;
            }

            // Prepare the next iteration
            pagedSearchControl.setSize(300);
        }

        if (hasUnwillingToPerform) {
            throw new IllegalStateException("AD can't handle paging");
        }

        // Cleanup the session
        connection.unBind();
        connection.close();
于 2013-12-04T16:43:06.723 回答
6

看看这个http://markmail.org/message/43qjepg6shvfvqud OTOH,总是建议在用户邮件列表上发布 ApacheDS 相关问题以获得快速回复,我们可能并不总是监控 SO

于 2013-08-01T07:36:05.150 回答
1

文件包含 RFC2696 中描述的简单分页结果控件扩展的演示。要编译和运行,需要UnboundID LDAP SDK

也可以看看

于 2013-07-31T12:38:38.167 回答