Adding Missing Overloaded API Methods
本节涵盖了如何添加自己的重载 API 方法以实现新功能。
Implementing Custom Search Methods
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
and 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
and 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();
}
}
当您使用 |
Implementing Other Custom Context Methods
与自定义`search` 方法相同,你实际上可以通过使用 ContextExecutor
调用 DirContext
的任何方法,如下所示:
public interface ContextExecutor {
public Object executeWithContext(DirContext ctx) throws NamingException;
}
在实现自定义 ContextExecutor
时,你可以选择使用 executeReadOnly()
或 executeReadWrite()
方法。假设你希望调用以下方法:
Object lookupLink(Name name)
此方法在 DirContext
中可用,但在 LdapTemplate
中没有匹配的方法。这是一个查找方法,所以它应该是只读的。我们可以按照以下方式来实现它:
DirContext
method using 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()
方法来执行读写操作。