java-如何告诉LDAP DirContext.search(…).hasMore()返回false,而不是抛出PartialResultException
我设置LDAP DirContext.search(…)以忽略引用, 但是,当我调用namingumeration.hasMore()时,仍然会遇到一个引用异常 我能告诉DirContext.search忽略推荐吗, 所以NamingEnumeration.hasMore()返回false而不是抛出异常 这是剪下来的: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();
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;
}