对于最新稳定版本,请使用 Spring LDAP 4.0.2!spring-doc.cadn.net.cn

添加缺失的重载API方法

本部分介绍了如何添加您自己的重载API方法以实现新功能。spring-doc.cadn.net.cn

实现自定义搜索方法

LdapTemplate 包含了 DirContext 中最常见操作的多个重载版本。然而,我们并没有为每个方法签名都提供替代方案,主要是因为这样的方法签名太多了。不过,我们确实提供了一种方式,可以调用你想要的 DirContext 方法,同时还能获得 LdapTemplate 提供的好处。spring-doc.cadn.net.cn

假设您想要调用以下 DirContext 方法:spring-doc.cadn.net.cn

NamingEnumeration search(Name name, String filterExpr, Object[] filterArgs, SearchControls ctls)

LdapTemplate 中没有对应的重载方法。解决方法是使用自定义的 SearchExecutor 实现,如下所示:spring-doc.cadn.net.cn

public interface SearchExecutor {
   public NamingEnumeration executeSearch(DirContext ctx) throws NamingException;
}

在你的自定义执行器中,你可以访问一个 DirContext 对象,你可以用它来调用你想要的方法。然后你可以提供一个处理器,负责映射属性并收集结果。例如,你可以使用其中一个 CollectingNameClassPairCallbackHandler 的实现,它会将映射后的结果收集到内部列表中。为了实际执行搜索,你需要调用 LdapTemplate 中的 search 方法,该方法接受一个执行器和一个处理器作为参数。最后,你需要返回处理器所收集的内容。以下示例展示了如何完成所有操作:spring-doc.cadn.net.cn

示例 1. 使用 SearchExecutorAttributesMapper 的自定义搜索方法
public class PersonRepoImpl implements PersonRepo {
   ...
   public List search(final Name base, final String filter, final String[] params,
         final SearchControls ctls) {
      SearchExecutor executor = new SearchExecutor() {
         public NamingEnumeration executeSearch(DirContext ctx) {
            return ctx.search(base, filter, params, ctls);
         }
      };

      CollectingNameClassPairCallbackHandler handler =
         new AttributesMapperCallbackHandler(new PersonAttributesMapper());

      ldapTemplate.search(executor, handler);
      return handler.getList();
   }
}

如果更倾向于将 ContextMapper 设置为 AttributesMapper,以下示例展示了它会是什么样子的:spring-doc.cadn.net.cn

示例 2. 使用 SearchExecutorContextMapper 的自定义搜索方法
public class PersonRepoImpl implements PersonRepo {
   ...
   public List search(final Name base, final String filter, final String[] params,
         final SearchControls ctls) {
      SearchExecutor executor = new SearchExecutor() {
         public NamingEnumeration executeSearch(DirContext ctx) {
            return ctx.search(base, filter, params, ctls);
         }
      };

      CollectingNameClassPairCallbackHandler handler =
         new ContextMapperCallbackHandler(new PersonContextMapper());

      ldapTemplate.search(executor, handler);
      return handler.getList();
   }
}
当使用 ContextMapperCallbackHandler 时,必须确保你已经在你的 SearchControls 实例上调用了 setReturningObjFlag(true)

实现其他自定义上下文方法

同自定义search方法一样,您可以使用ContextExecutor来调用DirContext中的任何方法,如下所示:spring-doc.cadn.net.cn

public interface ContextExecutor {
   public Object executeWithContext(DirContext ctx) throws NamingException;
}

当实现一个自定义ContextExecutor时,您可以选择使用executeReadOnly()方法或executeReadWrite()方法。假设有以下方法需要调用:spring-doc.cadn.net.cn

Object lookupLink(Name name)

该方法在DirContext中可用,但在LdapTemplate中没有匹配的方法。这是一个查找方法,因此应该是只读的。我们可以实现如下:spring-doc.cadn.net.cn

示例 3. 使用 ContextExecutor 的自定义 DirContext 方法
public class PersonRepoImpl implements PersonRepo {
   ...
   public Object lookupLink(final Name name) {
      ContextExecutor executor = new ContextExecutor() {
         public Object executeWithContext(DirContext ctx) {
            return ctx.lookupLink(name);
         }
      };

      return ldapTemplate.executeReadOnly(executor);
   }
}

同样的方式,你可以通过使用executeReadWrite()方法来进行读写操作。spring-doc.cadn.net.cn