Cliente EJB remoto

Pessoal, estou começando com EJB. Já consegui fazer funcionar um EJB com um cliente Home aplicado em um Servlet, agora quero fazer funcionar com a inteface remota. Eu tentei fazer da seguinte forma (estou me baseando em um tutorial que encontrei). Será que alguém pode me ajudar?

Meu cliente remoto:

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

import aplicacao.interfaces.LoginHome;

public class TesteLogin
{
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Hashtable t = new Hashtable();
        t.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        t.put(Context.PROVIDER_URL, "localhost");

		
		LoginHome home;
		try
		{
			Context context = new InitialContext(t);
			Object ref = context.lookup("java:/comp/env/ejb/Login");
			home = (LoginHome) PortableRemoteObject.narrow(ref, LoginHome.class);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		
	}

}

Erro como resultado da execução:

javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
	at javax.naming.InitialContext.init(InitialContext.java:223)
	at javax.naming.InitialContext.<init>(InitialContext.java:197)
	at TesteLogin.main(TesteLogin.java:27)
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:242)
	at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:42)
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
	... 4 more

Olá hlhaas,

Você colocou os JARs certos do JBoss no classpath da sua aplicação? No momento, eu não tô lembrado exatamente quais são, mas se eu não me engano são uns 6 JARs… na dúvida, coloque tudo que tá em <JBOSS_HOME>/lib :stuck_out_tongue: O seu problema é que sua aplicação não tá encontrando aquela classe ali (org.jnp.interfaces.NamingContextFactory), que está em algum dos JARs necessários.

Até mais, :wink:

tem o jboss-client-all eu acho… somente esse jar já é o suficiente

nao esquece de fazer com o context factory e tal

:stuck_out_tongue:

cd1,

eu coloquei todos os JARS que estão em <JBOSS_HOME>/lib e não resolveu. Eu estou achando que o apontamento “org.jnp.interfaces.NamingContextFactory” não deve estar correto.

Então,

utilizei a dica do Leozin e funcionou, o jar é o jbossall-client.jar, que está em <JBOSS_HOME>/client

Obrigado pessoal !

Leozin,

o que você quiz dizer com [quote]nao esquece de fazer com o context factory e tal [/quote] ?

porque quando utilizei ejbs remotos tive que utilizar um INITIAL_CONTEXT_FACTORY e um objeto properties etc pra efetuar os jndi lookup

tente substituir isto

     Hashtable t = new Hashtable();
     t.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
     t.put(Context.PROVIDER_URL, "localhost");

por isto :


      Properties props = new Properties();
      props.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 
      props.put("java.naming.provider.url","jnp://localhost:1099");