2012-04-24 6 views
5

Ho impostato LDAP DirContext.search (...) per ignorare i riferimenti, ma io ottieni comunque un'eccezione di riferimento quando chiamo NamingEnumeration.hasMore().java- come dire a LDAP DirContext.search (...). HasMore() per restituire false invece di lanciare una PartialResultException

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) 

Posso dire DirContext.search di ignorare i rinvii, in modo che NamingEnumeration.hasMore() restituisce false, invece di un'eccezione?

questo è il snipped:

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()); 
} 

Nota: se abilito i rinvii, ottengo un expcetion LdapReferralException quando chiamo NamingEnumeration.hasMore().

risposta

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(); 
} 

chiamando e.hasMoreElements() anziché e.hasMore() risolve il problema. ovvero restituisce false (anziché generare un'eccezione) quando ci sono riferimenti.

tuttavia, non è una soluzione ottimale, nel senso che potrebbero mancare altre eccezioni NamingException reali (ad esempio CommunicationException).

Vorrei ancora trovare il modo corretto per dire a DirContext.search di ignorare i riferimenti, in modo che NamingEnumeration.hasMore() restituisca false invece di generare un'eccezione. qualche idea?

ho scaricato il codice sorgente JDK a http://download.java.net/openjdk/jdk6/ -> openjdk-6-src-b24-14_nov_2011.tar.gz tuttavia questo codice sorgente non corrisponde esattamente con i binari JDK, vedere how to find the exact sources of a JDK1.6 binary (including com.sun.jndi.*)

da questo Il codice sorgente JDK sottostante non sembra possibile ottenere un "falso" invece di un'eccezione quando ci sono riferimenti.

./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; 
} 

ma ancora non ne sono sicuro.

Penso che sia ragionevole dire a DirContext.search di ignorare i riferimenti, in modo che NamingEnumeration.hasMore() restituisca false invece di generare un'eccezione.

qualche idea?