Вернуть записи ldap в разбитой на страницы форме в springboot - PullRequest
0 голосов
/ 27 марта 2019

У меня есть метод ldap, который возвращает всех пользователей, которые в нем (почти 1300 пользователей), и я хочу вернуть их по странице, аналогично тому, что PagingAndSortingRepository делает в Springboot:

Если у меня есть эта конечная точка (users /? page = 0 & size = 1) и я хочу вернуться на страницу 0 только к одной записи.

Есть ли способ сделать это?

В настоящее время у меня есть это, но это не такработа:

SearchRequest searchRequest = new SearchRequest(ldapConfig.getBaseDn(), SearchScope.SUB,
                Filter.createEqualityFilter("objectClass", "person"));
        ASN1OctetString resumeCookie = null;
        while (true) {
            searchRequest.setControls(new SimplePagedResultsControl(pageable.getPageSize(), resumeCookie));
            SearchResult searchResult = ldapConnection.search(searchRequest);
            numSearches++;
            totalEntriesReturned += searchResult.getEntryCount();
            for (SearchResultEntry e : searchResult.getSearchEntries()) {

                 String[] completeDN = UaaUtils.searchCnInDn(e.getDN());
                 String[] username = completeDN[0].split("=");
                 UserEntity u = new UserEntity(username[1]);
                 list.add(u);

                System.out.println("TESTE");
            }

            SimplePagedResultsControl responseControl = SimplePagedResultsControl.get(searchResult);
            if (responseControl.moreResultsToReturn()) {
                // The resume cookie can be included in the simple paged results
                // control included in the next search to get the next page of results.
                System.out.println("Antes "+resumeCookie);
                resumeCookie = responseControl.getCookie();
                System.out.println("Depois "+resumeCookie);
            } else {
                break;
            }

            Page<UserEntity> newPage = new PageImpl<>(list, pageable, totalEntriesReturned);

            System.out.println("content " + newPage.getContent());
            System.out.println("total elements " + newPage.getTotalElements());

            System.out.println(totalEntriesReturned);
        }

1 Ответ

0 голосов
/ 29 марта 2019

Я не уверен, что это правильный путь, но вот как я поступил:

public PaginatedLookup getAll(String page, String perPage) {
  PagedResultsCookie cookie = null;
  List<LdapUser> results;

  try {
      if ( page != null ) {
          cookie = new PagedResultsCookie(Hex.decode(page));
      } // end if

      Integer pageSize = perPage != null ? Integer.parseInt(perPage) : PROCESSOR_PAGE_SIZE;

      PagedResultsDirContextProcessor processor = new PagedResultsDirContextProcessor(pageSize, cookie);
      LdapName base = LdapUtils.emptyLdapName();

      SearchControls sc = new SearchControls();
      sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
      sc.setTimeLimit(THREE_SECONDS);
      sc.setCountLimit(pageSize);
      sc.setReturningAttributes(new String[]{"cn", "title"});

      results = ldapTemplate.search(base, filter.encode(), sc, new PersonAttributesMapper(), processor);

      cookie = processor.getCookie();
  } catch ( Exception e ) {
      log.error(e.getMessage());
      return null;
  } // end try-catch

  String nextPage = null;

  if ( cookie != null && cookie.getCookie() != null ) {
      nextPage = new String(Hex.encode(cookie.getCookie()));
  } // end if
  return new PaginatedLookup(nextPage, results);
}

Основная проблема, которую я продолжал затрагивать, - это попытка получить cookie-файл как что-то, что могло быть отправлено клиенту, и именно здесь мои Hex.decode и Hex.encode пригодились. PersonAttributesMapper - это частный преобразователь, который должен сделать поля более удобочитаемыми, а PaginatedLookup - это пользовательский класс, который я использую для ответов API.

...