在Linux下使用分页响应PagedResultsDirContextProcessor使用Spring LDAP查询AD不起作用

问题描述

我的 bean 中有这样一个方法

/**
*
* @param searchBase - The base DN where the search should start.
* @return List of EmployeeContacts built from persons found in AD under the searchBase
*/
private List<EmployeeContact> getAllPersonsFromBase(String searchBase) {
   final PagedResultsDirContextProcessor processor = new
                                      PagedResultsDirContextProcessor(500);
   final SearchControls searchControls = new SearchControls();
   searchControls.setSearchScope(SearchControls.SUBTREE_ScopE);

   return SingleContextSource.doWithSingleContext(
           contextSource,singleContextLdapOperations -> {
               List<EmployeeContact> result = new LinkedList<>();
               do {
                   List<EmployeeContact> oneResult = singleContextLdapOperations.search(
                           searchBase,"(&(objectClass=user)(objectCategory=person))",searchControls,this::mapAttributesToEmployeeContact,processor);
                   result.addAll(oneResult);
               } while(processor.hasMore());
               return result;
               });
}

它在我的 Windows 10 (Oracle JDK 11.0.9) 下完美运行。 在装有 Windows 10 的干净虚拟机上对其进行了测试,结果相同 - 正常工作。

但是我在 Ubuntu 下运行它时遇到问题。从 11.0.8 到 11.0 尝试了 JDK。结果总是一样的。

搜索结果包含少于 500 个(方法中的硬编码)记录时,它工作正常。但是当结果被分页时它失败了:

2021-05-07T18:50:50,380 INFO  [scheduling-1] org.spr.lda.con.AbstractFallbackRequestAndResponseControlDirContextProcessor: No matching response control found - looking for 'class javax.naming.ldap.PagedResultsResponseControl
2021-05-07T18:50:50,381 ERROR [scheduling-1] biz.san.it.int.sw_.ADReader: Exception been caught while querying Active Directory. Exception:
java.lang.classCastException: class java.lang.String cannot be cast to class [B (java.lang.String and [B are in module java.base of loader 'bootstrap')

看起来它在 Ubuntu 下运行时无法加载类 javax.naming.ldap.PagedResultsResponseControl。 然后它以奇怪的异常失败,可能是因为不可预测的响应。 当搜索结果返回少于 500 条记录时,它工作正常。但是当结果被分页时它失败了。

解决方法

问题出在 application.yaml 编码中。 CRLF 的东西。该文件已在 windows 记事本中编辑,然后传输到 Linux VM。 当我用 vim 编辑文件时,更改了 ldap 配置部分中的一些行,然后重新启动了我的服务,问题就消失了。