不足しているオーバーロードされた 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
メソッドを呼び出す必要があります。最後に、ハンドラーが収集したものをすべて返す必要があります。次の例は、そのすべてを行う方法を示しています。
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
を好む場合、次の例はそれがどのようになるかを示しています。
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
には一致するメソッドがありません。これはルックアップメソッドなので、読み取り専用にする必要があります。次のように実装できます。
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()
メソッドを使用して読み取り / 書き込み操作を実行できます。