Извлечение данных из NamingEnumeration - PullRequest
4 голосов
/ 13 декабря 2011

Мое приложение ищет людей на сервере 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 объекта. Как я могу получить несколько значений из него.

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Поскольку вы используете java.util.List из javax.naming.NamingEnumeration<java.util.Vector>, например,

List<NamingEnumeration<Vector>> list

Вы должны иметь возможность перебирать Vector в каждом NamingEnumeration:

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>>>
2 голосов
/ 13 декабря 2011

При итерации списка с использованием синтаксиса for, представленного в Java5

Вы не должны звонить 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 );
}
0 голосов
/ 07 сентября 2017

Этот фрагмент кода будет выполнять работу для неизвестных имен атрибутов и одного или нескольких значений (например, нескольких классов объектов):

Использование 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...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...