第四章 添加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() 来执行