新增遺失的過載 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()
方法執行讀寫操作。