2015-09-04 5 views
0

Я следующей схеме LDAP:Spring LDAP с динамической базой DN

enter image description here

Каждый поддерево содержит организации блок Team. Я хочу найти все команды из определенного поддерева. Для этого я использую класс LdapTemplate и методы findAll().

ldapTemplate.findAll(Team.class); 

Когда я устанавливаю базу в LdapContextSource для dc=global,dc=id,dc=pl она возвращает мне команды от глобального поддерева. Когда я меняю базу на dc=id,dc=pl, она возвращает мне команды из всех поддеревьев.

Проблема в том, что я хочу использовать динамическую базу, чтобы найти команды из определенного поддерева. Я пробовал несколько методов для достижения этого, но ни один из них не дает мне результатов.

Метод 1: найти

Name nameBase = LdapUtils.newLdapName("dc=global"); 
return ldapTemplate.find(query().base(nameBase).where("ou").is("team"), Team.class); 

возвращает пустой список

Метод 2: FindAll

Name nameBase = LdapUtils.newLdapName("dc=global"); 
SearchControls searchControls = new SearchControls(); 
return ldapTemplate.findAll(nameBase, searchControls, Team.class); 

возвращает пустой список

В первый Похоже работает правильно, потому что, когда я изменить поддерево имя некоторые из которых не существует Я получаю javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]

Любые идеи, почему я получаю правильные результаты в этом коде:

LdapContextSource contextSource = new LdapContextSource(); 
contextSource.setBase("dc=global,dc=id,dc=pl"); 

LdapTemplate ldapTemplate = new LdapTemplate(contextSource); 
return ldapTemplate.findAll(Team.class); 

И пустые список из этого:

LdapContextSource contextSource = new LdapContextSource(); 
contextSource.setBase("dc=id,dc=pl"); 

LdapTemplate ldapTemplate = new LdapTemplate(contextSource); 
Name nameBase = LdapUtils.newLdapName("dc=global"); 
SearchControls searchControls = new SearchControls(); 
return ldapTemplate.findAll(nameBase, searchControls, Team.class); 

Я использую Spring-LDAP-ядро 2.0.3

ответ

0

Я нашел решение.

Первого

Добавление надлежащих возможностей для SearchControls

SearchControls searchControls = new SearchControls(); 
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
return ldapTemplate.findAll(base, searchControls, Team.class); 

Второго

Изменения параметров запроса, чтобы проверить, если сп присутствует

return ldapTemplate.find(query().base(base).where("cn").isPresent(), Team.class);