Использование Spring LDAP-шаблона - PullRequest
3 голосов
/ 30 сентября 2011

Пожалуйста, посмотрите на тестовый класс ниже.Я пытаюсь выполнить поиск LDAP с помощью Spring LDAP Template.Я могу искать и создавать список записей, соответствующих критериям поиска, без шаблона Spring LDAP, используя DirContext, как показано в методе searchWithoutTemplate ().Но когда я использую LdapTemplate, я получаю NPE, как показано ниже.Я уверен, что я что-то упустил.Может кто-нибудь помочь, пожалуйста?

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.LdapName;
import org.springframework.ldap.core.AttributesMapper;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.DefaultDirObjectFactory;
import org.springframework.ldap.core.support.LdapContextSource;

public class LDAPSearchTest {
    //bind params
    static String url="ldap://<IP>:<PORT>";
    static String userName="cn=Directory Manager";
    static String password="password123";
    static String bindDN="dc=XXX,dc=com";

    //search params
    static String base = "ou=StandardUser,ou=XXXCustomers,ou=People,dc=XXX,dc=com";
    static String filter = "(objectClass=*)";
    static String[] attributeFilter = { "cn", "uid" };
    static SearchControls sc = new SearchControls();

    public static void main(String[] args) throws Exception {
        // sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
        sc.setReturningAttributes(attributeFilter);
        searchWithTemplate(); //NPE
        //searchWithoutTemplate(); //works fine
    }

    public static void searchWithTemplate() throws Exception {
        DefaultDirObjectFactory factory = new DefaultDirObjectFactory();
        LdapContextSource cs = new LdapContextSource();
        cs.setUrl(url);
        cs.setUserDn(userName);
        cs.setPassword(password);
        cs.setBase(bindDN);
        cs.setDirObjectFactory(factory.getClass ());
        LdapTemplate template = new LdapTemplate(cs);
        template.afterPropertiesSet();
        System.out.println((template.search(new LdapName(base), filter, sc,
                new AttributesMapper() {
                    public Object mapFromAttributes(Attributes attrs)
                            throws NamingException {
                        System.out.println(attrs);
                        return attrs.get("uid").get();
                    }
                })));
    }

    public static void searchWithoutTemplate() throws NamingException{
        Hashtable env = new Hashtable(11);
        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, url);
        //env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, userName);
        env.put(Context.SECURITY_CREDENTIALS, password);
        DirContext dctx = new InitialDirContext(env);
        NamingEnumeration results = dctx.search(base, filter, sc);
        while (results.hasMore()) {
            SearchResult sr = (SearchResult) results.next();
            Attributes attrs = sr.getAttributes();
            System.out.println(attrs);
            Attribute attr = attrs.get("uid");
        }
        dctx.close();
    }
}

Исключение составляет:

Exception in thread "main" java.lang.NullPointerException
    at org.springframework.ldap.core.support.AbstractContextSource.getReadOnlyContext(AbstractContextSource.java:125)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:287)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:237)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:588)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:546)
    at LDAPSearchTest.searchWithTemplate(LDAPSearchTest.java:47)
at LDAPSearchTest.main(LDAPSearchTest.java:33)

Я использую Spring 2.5.6 и Spring LDAP 1.3.0

1 Ответ

3 голосов
/ 24 октября 2011

Быстрое сканирование показало, что виновником является поле authenticationSource, равное AbstractContextSource. Этот файл содержит следующий комментарий к методу afterPropertiesSet():

/**
* Checks that all necessary data is set and that there is no compatibility
* issues, after which the instance is initialized. Note that you need to
* call this method explicitly after setting all desired properties if using
* the class outside of a Spring Context.
*/
public void afterPropertiesSet() throws Exception {
    ...
}

Затем этот метод создает соответствующий authenticationSource, если вы его не предоставили. Поскольку ваш тестовый код выше определенно не работает в контексте Spring, и вы явно не установили authenticationSource, я думаю, вам нужно отредактировать ваш код следующим образом:

...
cs.setDirObjectFactory(factory.getClass ());

// Allow Spring to configure the Context Source:
cs.afterPropertiesSet();

LdapTemplate template = new LdapTemplate(cs);
...