[英]Junit Test for testing data in NamingEnumeration in LDAP connectivity test
[英]Extract data from NamingEnumeration
我的應用程序在LDAP服務器中搜索人員。
return ldapTemplate.search("", "(objectclass=person)", new AttributesMapper() {
public Object mapFromAttributes(Attributes attrs)
throws NamingException {
return attrs.get("cn").getAll();
}
});
它返回NamingEnumeration
對象的列表,其中包含向量。 每個向量可以包含一個或多個值。 我可以通過此代碼打印人名
for(NamingEnumeration ne : list){
while (ne.hasMore()) {
System.out.println("name is : " + ne.next().toString());
}
}
由於我的ldap搜索可以包含多個值,因此它位於NamingEnumeration
對象內的向量中。 如何從中獲取多個值。
當您使用javax.naming.NamingEnumeration<java.util.Vector>
的java.util.List
,如此
List<NamingEnumeration<Vector>> list
您應該能夠在每個NamingEnumeration
迭代Vector
:
for (NamingEnumeration<Vector> ne : list) {
while (ne.hasMore()) {
Vector vector = ne.next();
for (Object object : vector) {
System.out.println(object);
}
}
}
請注意,許多人認為Vector
已過時,但並未棄用。 此外,封閉的集合可以使用類型參數。 如果您有選擇,請考慮以下替代方案之一:
List<NamingEnumeration<Vector<T>>>
List<NamingEnumeration<List<T>>>
使用Java5引入的for
語法迭代列表時
你不應該調用hasMore()
for(NamingEnumeration ne : list){
System.out.println("name is : " + ne.toString());
}
如果您的列表不支持Iterator接口,則需要使用舊表單:
for ( Enumeration e = v.elements() ; e.hasMoreElements() ; ) {
String a = (String) e.nextElement();
System.out.println( a );
}
此代碼段將處理未知屬性名稱以及單個或多個值(例如多個對象類):
使用spring-ldap 2.3.1和AttributesMapper實現:
<!-- https://mvnrepository.com/artifact/org.springframework.ldap/spring-ldap-core -->
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
在此示例代碼中,searchResultList包含所有條目,每個條目都表示為屬性映射(具有一個或多個值):
List<Map<String, List<String>>> searchResultList = sourceLdapTemplate.search(searchBase, filter.encode(), SearchControls.ONELEVEL_SCOPE, new AttributesMapper<Map<String, List<String>>>() {
@Override
public Map<String, List<String>> mapFromAttributes(Attributes attributes) throws NamingException {
Map<String, List<String>> attrsMap = new HashMap<>();
NamingEnumeration<String> attrIdEnum = attributes.getIDs();
while (attrIdEnum.hasMoreElements()) {
// Get attribute id:
String attrId = attrIdEnum.next();
// Get all attribute values:
Attribute attr = attributes.get(attrId);
NamingEnumeration<?> attrValuesEnum = attr.getAll();
while (attrValuesEnum.hasMore()) {
if (!attrsMap.containsKey(attrId))
attrsMap.put(attrId, new ArrayList<String>());
attrsMap.get(attrId).add(attrValuesEnum.next().toString());
}
}
return attrsMap;
}
});
現在,使用searchResultList看起來像這樣:
for (Map<String, List<String>> attrsMap : searchResultList) {
for (String objectClass : m.get("objectClass")) {
// do something with this objectClass...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.