2016-05-03 100 views
2

我在應用邏輯不查詢時遇到問題。JNDI:如何使用邏輯不查詢來搜索LDAP

例如,

NamingEnumeration<SearchResult> results = 
    context.search("ou=people,dc=example,dc=com", "sn=Kumaran", searcCon); 

上面的語句是工作絕對沒問題,它返回的所有個人條目由SN是庫馬蘭。

假設我更改語句以獲取其中sn爲而非 Kumaran的所有人員條目。

NamingEnumeration<SearchResult> results = 
    context.search("ou=people,dc=example,dc=com", "(!sn=Kumaran)", searcCon); 

我收到以下錯誤:

Exception in thread "main" javax.naming.directory.InvalidSearchFilterException: Unbalanced parenthesis; remaining name 'ou=people,dc=example,dc=com' 
    at com.sun.jndi.ldap.Filter.findRightParen(Filter.java:694) 
    at com.sun.jndi.ldap.Filter.encodeFilterList(Filter.java:733) 
    at com.sun.jndi.ldap.Filter.encodeComplexFilter(Filter.java:657) 
    at com.sun.jndi.ldap.Filter.encodeFilter(Filter.java:118) 
    at com.sun.jndi.ldap.Filter.encodeFilterString(Filter.java:74) 
    at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:548) 
    at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1985) 
    at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1844) 
    at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1769) 
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392) 
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358) 
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:341) 
    at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267) 
    at jndi_tutorial.Test.getPeopleSnIsKumaran(Test.java:34) 
    at jndi_tutorial.Test.main(Test.java:62) 

以下是我的代碼

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); 
    } 

參考

https://technet.microsoft.com/en-us/library/aa996205(v=exchg.65).aspx

回答

3

嘗試添加括號(!(sn=Kumaran))

UPDATE:

試試這個

... 
SearchControls searcCon = new SearchControls(); 
String[] attributeFilter = { "cn", "description" }; 
searcCon.setReturningAttributes(attributeFilter); 
searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE); 
... 
+0

我嘗試了你的建議。這是工作。只有我面對的問題是,我能夠獲得與description屬性相關的信息。但是當我查詢屬性cn,我得到NullPointerException。 sn和cn之間是否有鏈接? –

+0

我正在使用Apache Directory Studio –

+0

我需要查看您的所有代碼才能回答。也許你需要明確指定你需要的屬性。 –

0

請參見RFC 2254:

filter ::= "(" filtercomp ")"

not ::= "!" filter

您的代碼應該是這樣

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

它應該爲你工作。