2012-04-24 8 views
5

Konfiguruję LDD DirContext.search (...), aby zignorować poleconych, , ale ja nadal otrzymuję wyjątek skierowania, gdy wywołuję NamingEnumeration.hasMore().java- jak powiedzieć LDAP DirContext.search (...). HasMore(), aby zwrócić false, zamiast rzucać 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) 

Mogę powiedzieć DirContext.search ignorować skierowania, tak że NamingEnumeration.hasMore() zwraca false zamiast rzucać wyjątek?

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

Uwaga: jeśli włączę skierowania, otrzymuję expcetion LdapReferralException gdy zgłoszę NamingEnumeration.hasMore().

Odpowiedz

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

Wywołanie e.hasMoreElements() zamiast e.hasMore() rozwiązuje problem. to znaczy, że zwraca false (zamiast rzucania wyjątku), gdy są odwołania.

nie jest to jednak rozwiązanie optymalne, ponieważ może brakować innych wyjątków wyjątków związanych z NamingException (takich jak wyjątek CommunicationException).

Nadal chciałbym znaleźć odpowiedni sposób, aby poinformować DirContext.search o zignorowaniu poleconych, , aby NamingEnumeration.hasMore() zwrócił wartość false zamiast rzucać wyjątek. jakiś pomysł?

Pobrałem kod źródłowy JDK na http://download.java.net/openjdk/jdk6/ -> openjdk-6-src-b24-14_nov_2011.tar.gz jednak ten kod źródłowy nie odpowiadają dokładnie binaria JDK, zobaczyć how to find the exact sources of a JDK1.6 binary (including com.sun.jndi.*)

z tego Kod źródłowy JDK poniżej nie wydaje się być możliwe, aby uzyskać "false" zamiast wyjątku, gdy istnieją odwołania.

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

ale nadal nie jestem pewien.

Myślę, że to ma sens, abyśmy mogli powiedzieć DirContext.search, aby zignorował polecenia, , aby NamingEnumeration.hasMore() zwrócił wartość false zamiast rzucać wyjątek.

jakiś pomysł?

Powiązane problemy