|
对于最新的稳定版本,请使用 Spring LDAP 3.3.3! |
添加缺少的重载 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,它将映射的结果收集到内部列表中。为了实际执行搜索,您需要调用search方法LdapTemplate它采用执行器和处理程序作为参数。最后,您需要返回处理程序收集的任何内容。以下示例演示了如何执行所有这些作:
SearchExecutor和AttributesMapperpublic 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和ContextMapperpublic 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如下:
public interface ContextExecutor {
public Object executeWithContext(DirContext ctx) throws NamingException;
}
实现自定义ContextExecutor,您可以选择使用executeReadOnly()或executeReadWrite()方法。假设您要调用以下方法:
Object lookupLink(Name name)
该方法可在DirContext,但中没有匹配方法LdapTemplate.它是一种查找方法,因此它应该是只读的。我们可以按如下方式实现它:
DirContext方法ContextExecutorpublic 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()方法。