2012-04-24 6 views
5

फेंकने के बजाय झूठी वापसी करने के लिए मैंने रेफरल, को अनदेखा करने के लिए एलडीएपी DirContext.search (...) सेट अप किया है, लेकिन मैं जब भी मैं नामकरण एंटरमेशन.hasMore() को कॉल करता हूं तब भी एक रेफ़रल अपवाद प्राप्त करें।जावा- एलडीएपी DirContext.search (...) को कैसे बताना है। हैमोर() एक 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) 

मैं DirContext.search बता सकते हैं रेफरल अनदेखी करने के लिए, तो NamingEnumeration.hasMore() के बजाय एक अपवाद फेंकने के झूठे रिटर्न कि?

इस

है कतरना:

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.hasMoreElements() के बजाय e.hasMoreElements() को कॉल करने से समस्या हल हो जाती है। रेफरल होने पर है, यह गलत है (अपवाद फेंकने के बजाय)।

तथापि, यह एक इष्टतम समाधान, भावना है कि हम (जैसे CommunicationException के रूप में) अन्य वास्तविक NamingException अपवाद अनुपलब्ध हो सकता है में नहीं है।

मैं अभी भी रेफरल, को अनदेखा करने के लिए DirContext.search को बताने का उचित तरीका ढूंढना चाहता हूं ताकि नामकरण एन्मुरेशन.hasMore() अपवाद फेंकने के बजाय झूठी रिटर्न दे। कोई विचार?

मैं http://download.java.net/openjdk/jdk6/ पर JDK स्रोत कोड डाउनलोड किया -> openjdk-6-src-b24-14_nov_2011.tar.gz लेकिन इस स्रोत कोड JDK binaries के साथ बिल्कुल अनुरूप नहीं है, इस से how to find the exact sources of a JDK1.6 binary (including com.sun.jndi.*)

देखना रेफ़रल होने पर अपवाद के बजाय "झूठी" प्राप्त करने के लिए नीचे जेडीके स्रोत कोड संभव नहीं लगता है।

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

लेकिन फिर भी मुझे यकीन नहीं है।

मुझे लगता है कि यह समझ में आता है कि हम रेफरल, को अनदेखा करने के लिए DirContext.search को बता सकते हैं ताकि नामकरण एन्मुरेशन.hasMore() अपवाद फेंकने के बजाय झूठी वापसी कर सके।

किसी भी विचार?

संबंधित मुद्दे