gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:49 25 4
gpt4 key购买 nike

我将 LDAP DirContext.search(...) 设置为忽略引用,但是当我调用 NamingEnumeration.hasMore() 时,我仍然得到一个引用异常。

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() 返回 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 异常。

最佳答案

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.hasMore() 可以解决问题。也就是说,当有引用时,它返回 false(而不是抛出异常)。

但是,这不是最佳解决方案,因为我们可能会遗漏其他真正的 NamingException 异常(例如 CommunicationException)。

我仍然想找到正确的方法来告诉 DirContext.search 忽略引用,以便 NamingEnumeration.hasMore() 返回 false 而不是抛出异常。有什么想法吗?

我在 http://download.java.net/openjdk/jdk6/ 下载了 JDK 源代码-> openjdk-6-src-b24-14_nov_2011.tar.gz然而,此源代码与 JDK 二进制文件并不完全对应, 见how to find the exact sources of a JDK1.6 binary (including com.sun.jndi.*)

从下面的这个 JDK 源代码来看,当存在引用时,似乎不可能得到“假”而不是异常。

./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 忽略引用是有意义的,以便 NamingEnumeration.hasMore() 返回 false 而不是抛出异常。

有什么想法吗?

关于java- 如何告诉 LDAP DirContext.search(...).hasMore() 返回 false 而不是抛出 PartialResultException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com