2012-08-28 24 views
6

Pytanie mówi wszystko. Kiedy jestem drukowania atrybutu to:Jak wyodrębnić wartość z javax.naming.directory.Attribute

cn: WF-008-DAM-PS 

Fragment kodu jest:

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

Jak tylko pojawia się wartość, która jest: WF-008-DAM-PS, czyli bez kluczowej części? Pozdrawiam.

Odpowiedz

4

Wywołać metodę getValue() lub metodę getValue(int).

+0

właśnie te dwie metody są obecne w javax.naming.directory.BasicAttribute lub javax.naming.directory.Attribute? Istnieje metoda get (int). –

+0

'Atrybut' jest interfejsem,' BasicAttribute' implementuje 'Attribute'. Tak więc, 'final Object o = groupCn.getValue()', zakładając 'groupCn' ma jedną wartość. Jeśli jest wielowartościowy, użyj indeksu całkowitoliczbowego jako parametru do 'groupCn.getValue (index)' –

+0

Dzięki, ale nie ma takiej metody getValue() ani w http://docs.oracle.com/javase/1.4. 2/docs/api/javax/nazing/directory/BasicAttribute.html lub http://docs.oracle.com/javase/1.4.2/docs/api/javax/naming/directory/Attribute.html –

6

Rozwiązaniem jest:

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

Ogólne

Załóżmy, że mamy:

Attributes attributes; 
Attribute a = attributes.get("something"); 
  • if(a.size() == 1)
    • następnie można użyć a.get() lub a.get(0) aby uzyskać unikalną wartość
  • if(a.size() > 1)

    • iterację wszystkich wartości:

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

      Jeśli używasz a.get() tu powróci tylko pierwsza wartość, ponieważ jego wewnętrzna implementacja (w BasicAttribute) wygląda następująco:

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

Obie metody (get(int) i get()) wyrzuca NamingException.

Praktyczny przykład
(gdy instancja Attribute ma wiele wartości)

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

@Dvvoter, proszę dodać wyjaśnienie swojej decyzji ... Myślę, że jest to bardzo dobra odpowiedź. –

Powiązane problemy