5

リフェラルを無視するように LDAP DirContext.search(...) を設定しましたが、NamingEnumeration.hasMore() を呼び出すと依然としてリフェラル例外が発生します。

Exception in thread "main" javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name 'DC=company,DC=com'
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2846)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2820)
    at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(LdapNamingEnumeration.java:129)
    at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:198)
    at com.sun.jndi.ldap.LdapNamingEnumeration.hasMore(LdapNamingEnumeration.java:171)

NamingEnumeration.hasMore() が例外をスローする代わりに false を返すように、DirContext.search に参照を無視するように指示できますか?

これは切り取られたものです:

import javax.naming.*;
import javax.naming.directory.*;

Properties p = new Properties();
p.setProperty(Context.INITIAL_CONTEXT_FACTORY, ldapInitContextFactory);
p.setProperty(Context.PROVIDER_URL, ldapURL);
p.setProperty(Context.SECURITY_CREDENTIALS, ldapPassword);
p.setProperty(Context.SECURITY_PRINCIPAL, ldapUser);
p.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
p.setProperty(Context.REFERRAL, "ignore");
DirContext ctx = new InitialDirContext(p);

SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchControls.setDerefLinkFlag(false);

NamingEnumeration e = ctx.search(ldapBaseDN, ldapQuery, null, searchControls);

for (; e.hasMore();) {
    SearchResult sr = (SearchResult) e.next();
    System.out.println("\nSearch Result: " + sr.getName());
}

注: リフェラルを有効にすると、NamingEnumeration.hasMore() を呼び出したときに LdapReferralException expcetion が発生します。

4

2 に答える 2

8
javax/naming/NamingEnumeration.java
public interface NamingEnumeration<T> extends Enumeration<T> {
    public boolean hasMore() throws NamingException;
    public T next() throws NamingException;
    ...
}

java/util/Enumeration.java
public interface Enumeration<E> {
    boolean hasMoreElements();
    E nextElement();
}

e.hasMore() の代わりに e.hasMoreElements() を呼び出すと、問題が解決します。つまり、参照がある場合は (例外をスローする代わりに) false を返します。

ただし、他の実際の NamingException 例外 (CommunicationException など) が欠落している可能性があるという意味で、これは最適なソリューションではありません。

NamingEnumeration.hasMore() が例外をスローする代わりに false を返すように、DirContext.search に参照を無視するように指示する適切な方法を見つけたいと思います。何か案が?

http://download.java.net/openjdk/jdk6/ -> openjdk-6-src-b24-14_nov_2011.tar.gzで JDK ソース コードをダウンロードしましたが、このソース コードは JDK バイナリと正確に対応していません。 JDK1.6 バイナリ (com.sun.jndi.* を含む) の正確なソースを見つける方法

以下のこの JDK ソース コードから、参照がある場合に例外ではなく「false」を取得することはできないようです。

./jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java
protected void processReturnCode(LdapResult res, Name resolvedName, Object resolvedObj, Name remainName, Hashtable envprops, String fullDN) throws NamingException {
    NamingException e;

    switch (res.status) {
    case LdapClient.LDAP_SUCCESS:

        // handle Search continuation references
        if (res.referrals != null) {
            msg = "Unprocessed Continuation Reference(s)";

            if (handleReferrals == LdapClient.LDAP_REF_IGNORE) {
                e = new PartialResultException(msg);
                break;
            }
        [...]
    }
    [...]
    throw e;
}

しかし、まだわかりません。

NamingEnumeration.hasMore() が例外をスローする代わりに false を返すように、DirContext.search に参照を無視するように指示することは理にかなっていると思います。

何か案が?

于 2012-04-24T22:17:03.180 に答える