java 从NamingEnumeration提取数据

tkclm6bt  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(97)

我的应用程序在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对象内部的向量。我如何从中获得多个值。

r7knjye2

r7knjye21#

当您使用java.util.Listjavax.naming.NamingEnumeration<java.util.Vector>时,

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>>>
bf1o4zei

bf1o4zei2#

在使用Java5引入的for语法迭代列表时
你不应该调用hasMore()

for(NamingEnumeration ne : list){   
    System.out.println("name is : " + ne.toString());     
}

如果你的list不支持Iterator接口,你需要使用旧的形式:

for ( Enumeration e = v.elements() ; e.hasMoreElements() ; ) {
    String a = (String) e.nextElement();
    System.out.println( a );
}
5ktev3wc

5ktev3wc3#

此代码片段将处理未知属性名称和单个或多个值(例如多个对象类):

使用spring-ldap 2.3.1AttributesMapper实现:

<!-- 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包含所有条目,每个条目都表示为属性的Map(具有一个或多个值):

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...
    }
}
2eafrhcq

2eafrhcq4#

NamingEnumeration扩展了Enumeration,因此您可以简单地使用Collections::list将Enumeration转换为List:

interface NamingEnumeration<T> extends Enumeration<T>
static <T> ArrayList<T> Collections::list(Enumeration<T> e)

NamingEnumeration nameEnum = attributes.get("attributeName").getAll()
list = Collections.list(nameEnum)

相关问题