不足しているオーバーロードされた 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;
}

カスタム executor では、必要なメソッドを呼び出すために使用できる DirContext オブジェクトにアクセスできます。次に、属性のマッピングと結果の収集を担当するハンドラーを提供できます。たとえば、マッピングされた結果を内部リストに収集する CollectingNameClassPairCallbackHandler の使用可能な実装の 1 つを使用できます。実際に検索を実行するには、エグゼキューターとハンドラーを引数として取る LdapTemplate の search メソッドを呼び出す必要があります。最後に、ハンドラーが収集したものをすべて返す必要があります。次の例は、そのすべてを行う方法を示しています。

例 1: SearchExecutor と AttributesMapper を使用したカスタム検索方法
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();
   }
}

AttributesMapper よりも ContextMapper を好む場合、次の例はそれがどのようになるかを示しています。

例 2: SearchExecutor と ContextMapper を使用したカスタム検索方法
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 を使用する場合、SearchControls インスタンスで setReturningObjFlag(true) を呼び出したことを確認する必要があります。

その他のカスタムコンテキストメソッドの実装

カスタム search メソッドと同じ方法で、次のように ContextExecutor を使用して DirContext の任意のメソッドを実際に呼び出すことができます。

public interface ContextExecutor {
   public Object executeWithContext(DirContext ctx) throws NamingException;
}

カスタム ContextExecutor を実装する場合、executeReadOnly() または executeReadWrite() メソッドのどちらを使用するかを選択できます。次のメソッドを呼び出すとします。

Object lookupLink(Name name)

メソッドは DirContext で使用できますが、LdapTemplate には一致するメソッドがありません。これはルックアップメソッドなので、読み取り専用にする必要があります。次のように実装できます。

例 3: ContextExecutor を使用したカスタム 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() メソッドを使用して読み取り / 書き込み操作を実行できます。