Java JNDI:如何使用逻辑not查询搜索LDAP

Java JNDI:如何使用逻辑not查询搜索LDAP,java,ldap,jndi,ldap-query,Java,Ldap,Jndi,Ldap Query,我在应用逻辑not查询时遇到问题 比如说, NamingEnumeration<SearchResult> results = context.search("ou=people,dc=example,dc=com", "sn=Kumaran", searcCon); 下面是我的代码 public static void printResults(NamingEnumeration<SearchResult> results) throw

我在应用逻辑not查询时遇到问题

比如说,

NamingEnumeration<SearchResult> results =
    context.search("ou=people,dc=example,dc=com", "sn=Kumaran", searcCon);
下面是我的代码

public static void printResults(NamingEnumeration<SearchResult> results)
            throws NamingException {
        while (results.hasMoreElements()) {
            SearchResult res = results.next();
            Attributes atbs = res.getAttributes();
            Attribute nameAttr = atbs.get("cn");
            String name = (String) nameAttr.get();

            Attribute descriptionAtr = atbs.get("description");
            String description = (String) descriptionAtr.get();
            System.out.println(description);

            System.out.println("Name is :" + name + ",description is :"
                    + description);

        }
    }

/* Get all people whose sn is not equal to Kumaran */
    public static void getAllExcludeKumaran() throws NamingException {
        SearchControls searcCon = new SearchControls();
        searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
        NamingEnumeration<SearchResult> results = context.search(
                "ou=people,dc=example,dc=com", "(!(sn=Kumaran))", searcCon);
        printResults(results);
    }
公共静态无效打印结果(NamingEnumeration结果)
抛出NamingException{
while(results.hasMoreElements()){
SearchResult res=results.next();
属性atbs=res.getAttributes();
属性nameAttr=atbs.get(“cn”);
字符串名称=(字符串)nameAttr.get();
属性descriptionator=atbs.get(“description”);
String description=(String)descriptionator.get();
系统输出打印项次(说明);
System.out.println(“名称为:“+Name+”,说明为:”
+说明);
}
}
/*找到所有sn不等于Kumaran的人*/
public static void getAllExcludeKumaran()引发NamingException{
SearchControls searcCon=新的SearchControls();
searcCon.setSearchScope(SearchControls.SUBTREE_范围);
NamingEnumeration结果=context.search(
“ou=people,dc=example,dc=com”,(!(sn=Kumaran)),searcCon);
打印结果(结果);
}
参考


尝试添加括号
(!(sn=Kumaran))

更新:

试试这个

...
SearchControls searcCon = new SearchControls();
String[] attributeFilter = { "cn", "description" };
searcCon.setReturningAttributes(attributeFilter);
searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
...
见RFC 2254:

筛选器::=“(“filtercomp”)”

非::=“!”过滤器

您的代码应该是

context.search("ou=people,dc=example,dc=com", "((!sn=Kumaran))", searcCon);

它应该对你有用。

我试着采纳了你的建议。它正在工作。我面临的唯一问题是,我能够获得与描述属性相关联的信息。但是当我查询属性cn时,我得到的是NullPointerException。sn和cn之间有什么联系吗?我正在使用Apache目录studio,我需要查看所有代码才能回答。也许您需要显式指定所需的属性。仍然获得NullPointerException一件奇怪的事情是,它为查询“NamingEnumeration results=context.search”(“ou=people,dc=example,dc=com”,“sn=Kumaran”,searcCon);”提供了包括cn在内的所有属性信息。这里我没有使用逻辑not(!),我只是搜索了所有人,其中sn=Kumaran。
...
SearchControls searcCon = new SearchControls();
String[] attributeFilter = { "cn", "description" };
searcCon.setReturningAttributes(attributeFilter);
searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
...
context.search("ou=people,dc=example,dc=com", "((!sn=Kumaran))", searcCon);