新增缺失的過載 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;
}
在你的自定義執行器中,你可以訪問一個 DirContext
物件,並用它來呼叫你想呼叫的方法。然後,你可以提供一個處理器來負責對映屬性並收集結果。例如,你可以使用 CollectingNameClassPairCallbackHandler
的一個可用實現,它會將對映的結果收集到一個內部列表中。要實際執行搜尋,你需要呼叫 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();
}
}
如果你更喜歡 ContextMapper
而不是 AttributesMapper
,以下示例展示瞭如何操作
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) 。 |
實現其他自定義 Context 方法
與自定義 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()
方法執行讀寫操作。