Разбиение на страницы LDAP с сервером сизелимить - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу реализовать подкачку ldap с помощью Spring-Ldap (2.3.2.RELEASE). Мой LDAP-сервер имеет ограничение размера 500. Если я получаю все результаты в одном запросе (без нумерации страниц), я получаю 500 записей (и не больше причины). Если я пытаюсь получить все результаты с размером страницы 100, у меня бесконечный цикл. Вот метод, который выполняет пейджинг:

private static final ContextMapper<String> ctxMapper = ctx -> ((DirContextAdapter) ctx).getNameInNamespace();

// ...

public Set<String> listGroups(int pageSize) {

    final SearchControls searchControls = new SearchControls();
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    PagedResultsDirContextProcessor processor = new PagedResultsDirContextProcessor(pageSize);

    // In order for a paged results cookie to continue being valid, it is necessary that the same underlying
    // connection is used for each paged results call. This can be accomplished using the SingleContextSource.
    return SingleContextSource.doWithSingleContext(contextSource,
            (LdapOperations operations) -> {
                Set<String> results = new LinkedHashSet<>();
                do {
                    final List<String> foundGroupNames = operations.search(
                            "",
                            "(objectClass=groupOfUniqueNames)",
                            searchControls,
                            ctxMapper,
                            processor);
                    logger.info("Import found {} external groups.", foundGroupNames.size());
                    results.addAll(foundGroupNames);
                } while (processor.hasMore());

                logger.info("Import found {} external groups.", results.size());
                return results;
            });
}

processor.hasMore() всегда возвращает true, но я не понимаю, почему. ContextSource - org.springframework.ldap.core.support.LdapContextSource

. Код работает, если я отключаю ограничение размера на сервере LDAP, чтобы сервер возвращал все результаты. Поэтому я предполагаю, что что-то упустил, но не знаю, что.

1 Ответ

0 голосов
/ 05 ноября 2019

Я полагаю, что у вас бесконечный цикл, потому что processor.hasMore() возвращает первую группу op 1000 каждый раз.

См. Также Paginate на сервере LDAP, который не поддерживает PagedResultsControl

...