添加缺失的超载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这需要执行人和处理人作为论据。最后,你需要归还你的训导员收集的所有东西。以下示例展示了如何实现这些:
例子1。一种自定义搜索方法
SearchExecutor和属性映射器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();
}
}
如果你更喜欢上下文地图前往属性映射器,以下示例展示了它的样子:
例子2。一种自定义搜索方法
SearchExecutor和上下文地图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)在你的搜索控制实例。 |
实现其他自定义上下文方法
与习俗方式相同搜索方法,你实际上可以调用任何方法DirContext通过使用上下文执行者如下:
public interface ContextExecutor {
public Object executeWithContext(DirContext ctx) throws NamingException;
}
实现自定义时上下文执行者,你可以选择使用executeReadOnly()或者executeReadWrite()方法。假设你想调用以下方法:
Object lookupLink(Name name)
该方法可在DirContext,但 中没有匹配方法LdapTemplate.这是一种查找方法,所以应该是只读的。我们可以这样实现:
例子3。一个习俗
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()方法。