2012-04-24 2 views
5

LDAP DirContext.search(...)を設定して照会を無視するように設定しましたが、 NamingEnumeration.hasMore()を呼び出すと、依然として参照例外が発生します。java DirContext.search(...)。hasMore()に、PartialResultExceptionをスローする代わりにfalseを返すように指示する方法

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を取得します。

答えて

7
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/でJDKのソースコードをダウンロード - はここからhow to find the exact sources of a JDK1.6 binary (including com.sun.jndi.*)

を参照してください、しかし、このソースコードは、JDKのバイナリで正確に対応していません> OpenJDKの-6-SRC-b24-14_nov_2011.tar.gz その下にある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に参照を無視するように指示することができます。

関連する問題