2012-08-28 35 views
6

問題說明了一切。當我打印的屬性是:如何從javax.naming.directory.Attribute中提取值

cn: WF-008-DAM-PS 

的代碼片段是:

private void searchGroup() throws NamingException { 
    NamingEnumeration<SearchResult> searchResults = getLdapDirContext().search(groupDN, "(objectclass=groupOfUniqueNames)", getSearchControls()); 
    String searchGroupCn = getCNForBrand(m_binder.getLocal("brandId"), m_binder.getLocal("brandName")); 
    Log.info(searchGroupCn); 
    while (searchResults.hasMore()) { 
     SearchResult searchResult = searchResults.next(); 
     Attributes attributes = searchResult.getAttributes(); 
     Attribute groupCn = attributes.get("cn"); 
     if(groupCn != null) { 
      Log.info(groupCn.toString());    
     } 
    } 
} 

如何我只得到那就是值:WF-008-DAM-PS,那就是沒有關鍵部分? 此致敬禮。

回答

4

調用getValue()方法或getValue(int)方法。

+0

是這兩種方法都存在於javax.naming.directory.BasicAttribute中或javax.naming.directory.Attribute中?有一個方法get(int)。 –

+0

'Attribute'是一個接口,'BasicAttribute'實現'Attribute'。所以,'最後的Object o = groupCn.getValue()',假設'groupCn'是單值的。如果它是多值的,使用整數索引作爲參數'groupCn.getValue(index)' –

+0

感謝但在http://docs.oracle.com/javase/1.4中都沒有這樣的方法getValue()。 2/docs/api/javax/naming/directory/BasicAttribute.html或http://docs.oracle.com/javase/1.4.2/docs/api/javax/naming/directory/Attribute.html –

6

解決的辦法是:

Attribute groupCn = attributes.get("cn"); 
String value = groupCn.get(); 
1

一般

比方說,我們有:

Attributes attributes; 
Attribute a = attributes.get("something"); 
  • if(a.size() == 1)
    • 那麼你可以使用a.get()a.get(0)通過所有的值,以獲得獨特的價值
  • if(a.size() > 1)

    • 迭代:

      for (int i = 0 ; i < a.size() ; i++) { 
          Object currentVal = a.get(i); 
          // do something with currentVal 
      } 
      

      如果使用a.get()在這裏,它會返回只有第一個值,因爲它的內部實現(在BasicAttribute)看起來像這樣:

      public Object get() throws NamingException { 
          if (values.size() == 0) { 
           throw new NoSuchElementException("Attribute " + getID() + " has no value"); 
          } else { 
           return values.elementAt(0); 
          } 
      } 
      

這兩種方法(get(int)get())拋出一個NamingException

實用示例
(當Attribute實例有多個值)

LdapContext ctx = new InitialLdapContext(env, null); 

Attributes attributes = ctx.getAttributes("", new String[] { "supportedSASLMechanisms" }); 
System.out.println(attributes); // {supportedsaslmechanisms=supportedSASLMechanisms: GSSAPI, EXTERNAL, DIGEST-MD5} 

Attribute a = atts.get("supportedsaslmechanisms"); 
System.out.println(a); // supportedSASLMechanisms: GSSAPI, EXTERNAL, DIGEST-MD5 

System.out.println(a.get()); // GSSAPI 

for (int i = 0; i < a.size(); i++) { 
    System.out.print(a.get(i) + " "); // GSSAPI EXTERNAL DIGEST-MD5 
} 
+0

@Downvoter,請添加關於您的決定的解釋...我認爲這是一個非常好的答案。 –