添加缺失的重载 API 方法
本节介绍如何添加您自己的重载 API 方法以实现新功能。
实现自定义搜索方法
LdapTemplate
包含 DirContext
中最常见操作的几个重载版本。但是,我们没有为每个方法签名都提供替代方案,主要是因为它们太多了。但是,我们提供了一种方法来调用您想要的任何 DirContext
方法,并且仍然获得 LdapTemplate
提供的优势。
假设您想调用以下 DirContext
方法
NamingEnumeration search(Name name, String filterExpr, Object[] filterArgs, SearchControls ctls)
LdapTemplate
中没有相应的方法重载。解决此问题的办法是使用自定义的 SearchExecutor
实现,如下所示
public interface SearchExecutor {
public NamingEnumeration executeSearch(DirContext ctx) throws NamingException;
}
在您的自定义执行器中,您可以访问 DirContext
对象,可以使用它来调用您想要的方法。然后,您可以提供一个处理程序,负责映射属性和收集结果。例如,您可以使用 CollectingNameClassPairCallbackHandler
的可用实现之一,该实现将映射的结果收集到内部列表中。为了实际执行搜索,您需要调用 LdapTemplate
中接受执行器和处理程序作为参数的 search
方法。最后,您需要返回处理程序收集到的任何内容。以下示例演示了如何执行所有这些操作
SearchExecutor
和 AttributesMapper
的自定义搜索方法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
,以下示例演示了它将是什么样子
SearchExecutor
和 ContextMapper
的自定义搜索方法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
中的任何方法,如下所示
public interface ContextExecutor {
public Object executeWithContext(DirContext ctx) throws NamingException;
}
在实现自定义 ContextExecutor
时,您可以选择使用 executeReadOnly()
或 executeReadWrite()
方法。假设您想调用以下方法
Object lookupLink(Name name)
该方法在 DirContext
中可用,但在 LdapTemplate
中没有匹配的方法。它是一个查找方法,因此应该是只读的。我们可以按如下方式实现它
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()
方法执行读写操作。