SpringLDAP-Reference (中文文档四)

来源:互联网 发布:淘宝新店提高信誉 编辑:程序博客网 时间:2024/05/19 12:26

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

原创粉丝点击