поиск (выбор) любых данных с сервера LDAP с использованием JNDI - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу выбрать (выполнить поиск) любые данные на моем сервере LDAP. У меня есть соединение, но я не знаю, как получить какие-либо данные. Может кто-нибудь дать совет, чтобы я мог видеть что-либо, например данные?

Проблема:

Когда я запускаю следующий код, я получаю:

Исключение в потоке "main" java.lang.ClassCastException: com.sun.jndi.ldap.LdapCtx не может быть приведено к javax.activation.DataSource`

Что я пробовал?

Источник данных имеет два импорта:

  • 1) javax.sql
  • 2) javax.activation

Я изменил другой импорт, но не работал.

Мой еще один вопрос: "Эти два импорта одинаковы?"

Исходный код:

public class LDAPJndi {

    //JNDI API를 사용하여 서버와 연결 (Connecting to LDAP server using JNDI)
    public static  DirContext connectJndi() throws NamingException {

        Hashtable<String, String> env = new Hashtable<String, String>(); 
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://192.168.0.60:389");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "cn=govmanager");
        env.put(Context.SECURITY_CREDENTIALS, "GOVmoi!manager");
        DirContext ctx = new InitialDirContext(env); 
        return ctx;
    } 

    public static void lookupJndi() throws NamingException {
        // a method for looking up any data
        DirContext ctx = connectJndi();
        Object o = ctx.lookup("c=kr");
        System.out.println(o);
        //above didn't work, so tried the bottom
        DataSource dataSource = (DataSource) ctx.lookup("c=kr"); //c=kr is BaseDN
        System.out.println(dataSource);
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

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

public static  DirContext connectJndi() throws NamingException {

    Hashtable<String, String> env = new Hashtable<String, String>(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://192.168.0.60:389");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "your id");
    env.put(Context.SECURITY_CREDENTIALS, "your password");
    //DirContext ctx = new InitialDirContext(env); 
    LdapContext ctx = new InitialLdapContext(env,null);
    return ctx;
} 


public static void lookupJndi() throws NamingException {
    //DirContext ctx = connectJndi();
    LdapContext ctx = (LdapContext) connectJndi();
    SearchControls ctls = new SearchControls();
    ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
    //ctls.setReturningAttributes(new String[] {"cn"});
    //String searchFilter=String.format("(cn=%s)", "cn" );
    String searchFilter="(objectClass=*)";
    //String searchFilter="(o=*)";

    NamingEnumeration<javax.naming.directory.SearchResult> results
     = ctx.search("c=kr", searchFilter,ctls);
    while(results.hasMoreElements()){
        javax.naming.directory.SearchResult sr = results.next();
        Attributes attrs = sr.getAttributes();
        //System.out.println(sr);
        System.out.println(attrs);
    }   
} // method
...