第四章 添加missing API方法重载
4.1自定义查询方法
尽管在LdapTemplate中有很多的DirContext重载方法,但它不可能对每个方法都这样做,因为方法太多了,但是我们提供一种方法使用LdapTemplate来得到你想要的conetxt
比如说你要调用如下的context方法
NamingEnumerationsearch(Namename,StringfilterExpr,Object[]filterArgs,SearchControlsctls)
在LdapTemplate中没有合适的重载方法,我们可以用自定义的SearchExecutor实现
publicinterfaceSearchExecutor{
publicNamingEnumerationexecuteSearch(DirContextctx)throwsNamingException;
}
在你自己定义的执行程序(executor)中,你可以连接DirContext,调用你想要的方法,然后你需要提供一个处理程序来处理返回结果。你可以使用现有的
CollectingNameClassPairCallbackHandler,收集到一个内部集合中,为了执行搜索,在LdapTemplate中需要一个执行程序和处理程序(an executor and a handler)
最后,返回你想要的结果集合
例4.1 使用SearchExecutor和AttributesMapper执行自定义查询
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
...
publicListsearch(finalNamebase,finalStringfilter,finalString[]params,
finalSearchControlsctls){
SearchExecutorexecutor=newSearchExecutor(){
publicNamingEnumerationexecuteSearch(DirContextctx){
returnctx.search(base,filter,params,ctls);
}
};
CollectingNameClassPairCallbackHandlerhandler=
newAttributesMapperCallbackHandler(newPersonAttributesMapper());
ldapTemplate.search(executor,handler);
returnhandler.getList();
}
}
如果你更喜欢用ContextMapper生成AttributesMapper,可以这样
例4.2 使用 SearchExecutor and ContextMapper的查询方法
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
...
publicListsearch(finalNamebase,finalStringfilter,finalString[]params,
finalSearchControlsctls){
SearchExecutorexecutor=newSearchExecutor(){
publicNamingEnumerationexecuteSearch(DirContextctx){
returnctx.search(base,filter,params,ctls);
}
};
CollectingNameClassPairCallbackHandlerhandler=
newContextMapperCallbackHandler(newPersonContextMapper());
ldapTemplate.search(executor,handler);
returnhandler.getList();
}
}
注意
当我们使用ContextMapperCallbackHandler时,必须在SearchControls中setReturningObjFlag(true)
4.2 实现其它自定义的Context Methods
同自定义查询方法一样,你可以在Dircontext中使用ContextExecutor
publicinterfaceContextExecutor{
publicObjectexecuteWithContext(DirContextctx)throwsNamingException;
}
当实现一个自定义的ContextExecutor时, executeReadOnly() 或者executeReadWrite(),比如我们要调用此方法
Object lookupLink(Namename)
在现有DirContext中,没有相对应的LdapTemplate方法,它是个查询方法,所以是只读的,我们可以这样实现它:
例4.3 使用ContextExecutor的自定义DirContext
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
...
publicObjectlookupLink(finalNamename){
ContextExecutorexecutor=newContextExecutor(){
publicObjectexecuteWithContext(DirContextctx){
returnctx.lookupLink(name);
}
};
returnldapTemplate.executeReadOnly(executor);
}
}
同样的操作你可以使用 executeReadWrite() 来执行