user840718 user840718 - 1 year ago 113
Java Question

ERROR: Need to specify class name in environment or system property LDAP and JNDI

This is my code:

public class TestConnection {

public static void main(String[] args) {
String password = "s3cret";
Map<String, String> env = new HashMap<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/dc=userdev,dc=local");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
//env.put(Context.SECURITY_PRINCIPAL, "uid="+ username +"cn=users"); // replace with user DN
env.put(Context.SECURITY_PRINCIPAL, "cn=dcmanager,cn=users,dc=userdev,dc=local"); // replace with user DN
env.put(Context.SECURITY_CREDENTIALS, password);

DirContext ctx = null;
try {
ctx = new InitialDirContext();
} catch (NamingException e) {
// handle
}
try {
SearchControls controls = new SearchControls();
controls.setSearchScope( SearchControls.SUBTREE_SCOPE);
ctx.search( "", "(objectclass=person)", controls);
// no need to process the results
} catch (NameNotFoundException e) {
e.printStackTrace();
System.out.println("catch 1");
// The base context was not found.
// Just clean up and exit.
} catch (NamingException e) {
System.out.println("catch 2");
e.printStackTrace();
// exception handling
} finally {
// close ctx or do Java 7 try-with-resources http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
}

}

}


I got this error (catch 2) :
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

I have looked for a lot of solutions, but I don't get the error.
Where is the problem?
Maybe the context, but I think that the code is perfectly correct.

Answer Source

You have to construct the InitialDirContext object using the env map you have populated. i.e. use the following code to construct it;

ctx = new InitialDirContext(env);