2012-04-24 18 views
5

Configuro el LDAP DirContext.search (...) para ignorar las referencias, pero yo aún así obtener una excepción de referencia cuando llamo NamingEnumeration.hasMore().java- cómo decir a LDAP DirContext.search (...). HasMore() para devolver falso en lugar de lanzar 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) 

Puedo decir DirContext.search hacer caso omiso de las referencias, de modo que NamingEnumeration.hasMore() devuelve falso en lugar de lanzar una excepción?

este es el 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: si me permiten una derivación, consigo un expcetion LdapReferralException cuando llamo NamingEnumeration.hasMore().

Respuesta

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

llamando a e.hasMoreElements() en lugar de e.hasMore() resuelve el problema. es decir, devuelve falso (en lugar de lanzar una excepción) cuando hay referencias. Sin embargo

, no es una solución óptima, en el sentido de que podría hacer falta otras excepciones reales NamingException (como CommunicationException).

Todavía gustaría encontrar la forma correcta de decir DirContext.search hacer caso omiso de las referencias, de modo que NamingEnumeration.hasMore() devuelve falso en lugar de lanzar una excepción. alguna idea?

he descargado el código fuente del JDK en http://download.java.net/openjdk/jdk6/ ->-OpenJDK 6-src-b24-14_nov_2011.tar.gz sin embargo, este código fuente no se corresponde exactamente con los binarios del JDK, ver how to find the exact sources of a JDK1.6 binary (including com.sun.jndi.*)

de esta no parece posible código fuente del JDK debajo de él para conseguir un "falso" en lugar de una excepción cuando existen referencias.

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

pero todavía no estoy seguro.

Creo que tiene sentido que podamos decirle a DirContext.search que ignore las referencias, para que NamingEnumeration.hasMore() devuelva falso en lugar de lanzar una excepción.

alguna idea?

Cuestiones relacionadas