此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring LDAP 3.2.8spring-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.解决这个问题的方法是使用自定义SearchExecutorimplementation 中实现,如下所示:spring-doc.cadn.net.cn

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

在您的自定义执行程序中,您可以访问DirContextobject,您可以使用它来调用所需的方法。然后,您可以提供负责映射属性和收集结果的处理程序。例如,您可以使用CollectingNameClassPairCallbackHandler,它将映射的结果收集到内部列表中。为了实际执行搜索,您需要调用searchmethod 中LdapTemplate,它将 executor 和 handler 作为参数。最后,您需要返回处理程序收集的任何内容。以下示例显示了如何执行所有这些作: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();
   }
}

如果您更喜欢ContextMapperAttributesMapper,以下示例显示了它的外观: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,您必须确保您已调用setReturningObjFlag(true)在您的SearchControls实例。

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

与自定义相同search方法,您实际上可以调用DirContext通过使用ContextExecutor如下: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.自定义DirContextmethod 使用ContextExecutor
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