java-如何告诉LDAP DirContext.search(…).hasMore()返回false,而不是抛出PartialResultException

java-如何告诉LDAP DirContext.search(…).hasMore()返回false,而不是抛出PartialResultException,java,ldap,Java,Ldap,我设置LDAP DirContext.search(…)以忽略引用, 但是,当我调用namingumeration.hasMore()时,仍然会遇到一个引用异常 我能告诉DirContext.search忽略推荐吗, 所以NamingEnumeration.hasMore()返回false而不是抛出异常 这是剪下来的: import javax.naming.*; import javax.naming.directory.*; Properties p = new Properties();

我设置LDAP DirContext.search(…)以忽略引用, 但是,当我调用namingumeration.hasMore()时,仍然会遇到一个引用异常

我能告诉DirContext.search忽略推荐吗, 所以NamingEnumeration.hasMore()返回false而不是抛出异常

这是剪下来的:

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表达式

但我仍然不确定

我认为我们可以告诉DirContext.search忽略推荐, 因此,namingumeration.hasMore()返回false,而不是抛出异常


有什么想法吗?

据我所知,有一种方法可以忽略引用,这在处理Active Directory LDAP操作时特别有用。您必须创建并注入一个新的
LdapTemplate
(使用配置的
ContextSource
构建),而不是从头开始创建自己的
InitialDirContext
。我不知道这是否与您的设置兼容。我希望这有帮助

从Spring LDAP核心
LdapTemplate

广告服务器显然无法自动处理转介,这会导致在搜索中遇到转介时抛出
PartialResultException
。要避免这种情况,请将
ignorePartialResultException
属性设置为
true


除了他使用的是JNDI,而不是Spring。
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());
}
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();
}
./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;
}