Erro ao efetuar busca em LDAP de dentro de um servlet

Desenvolvi um servlet que tenta efetuar uma busca (search) em um servidor LDAP. Qualquer comando lança uma exception:
NotContextException: Not an instance of DirContext

Detalhe: se colocar este código em uma Java application (método main, executando do prompt) funciona normalmente. Dá erro apenas no servlet.
Alguém tem alguma idéia? Aqui vai o código:

Hashtable env = new Hashtable(11);
DirContext ctx = new InitialDirContext(env);

env.put(Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER_URL, “ldap://192.168.1.2:389”);
env.put(Context.SECURITY_AUTHENTICATION, “simple”);
env.put(Context.SECURITY_PRINCIPAL, “cn=root”);
env.put(Context.SECURITY_CREDENTIALS, “12345”);

Attributes matchAttrs = new BasicAttributes(true);
String dn = “o=pec”;
Attributes attrs = ctx.getAttributes(dn); // lança exceção

Olá,

Eu não sei qual LDAP você está usando mas aqui com o OpenLDAP funciona sem problemas.

	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException
	{
		connect();
	}
	
	public void connect()
	{
		try
		{
			Hashtable env = new Hashtable();
			
			env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
			env.put(Context.SECURITY_AUTHENTICATION, "simple");
			env.put(Context.SECURITY_PRINCIPAL, "cn=administrator,dc=..." );
			env.put(Context.SECURITY_CREDENTIALS, "...." );
			env.put(Context.PROVIDER_URL, "ldap://localhost:389/dc=...." );
			env.put("java.naming.ldap.version", "3");
			
			ctx = new InitialDirContext(env);
			
			if ( isObjectExist("dc", "...") )
			{
				System.out.println("dc=.... - exist");
			}
			else
			{
				System.out.println("dc=.... - not exist");
			}
		}
		catch (NamingException e)
		{
			e.printStackTrace();
		}		
	}
	
	public boolean isObjectExist(String obj, String value)
			throws NamingException
	{
		return search("",obj, value).hasMore();
	}

	public NamingEnumeration search(String bind, String att, String value)
			throws NamingException
	{
		return searchFull(bind, "(" + att + "=" + value + ")");
	}
	
	public NamingEnumeration searchFull(String bind, String filter)
			throws NamingException
	{
		SearchControls ctls = new SearchControls();
		ctls.setSearchScope( SearchControls.SUBTREE_SCOPE );
		
		NamingEnumeration result = ctx.search(bind, filter, ctls);
		
		return result;
	}

Espero que ajude.

Lao

Ainda não funcionou…
Estou usando o IBM Directory Server. Qual app server está utilizando? Existe alguma configuração que deve ser feita no app server?

Valeu

Eu estou usando o JBoss, e não tive que fazer nenhuma parametrização.

O problema pode estar no diretório. Nós tivemos vários problemas quando mudamos do iPlanet para o OpenLDAP, muitas coisa que funcionavam no iPlanet tiveram que ter alguma coisa alterada ou retirada do código para funcionar no OpenLdap.

Sei que parece estranho, mas essa foi a realidade.

Agora nesse caso especifico eu não tenho IBM aqui para poder testar, mas aqui eu não tive nenhum problema de rodar o código dentro ou fora do AppServer.

[]s

Não tem nada específico no seu web.xml ?

Sobre LDAP somente isso.

[]s

estou com o mesmo problema…

se vc conseguir resolver, poste a solução, por favor.