EJB 3.0 + Eclipse + JBoss 5.1.0

Comunidade,

Estou estudando EJB 3.0 e não consigo executar o “simples” programa para um stateless session bean. Abaixo as classes juntamente com o erro quando executo o cliente. Vocês poderiam me ajudar?

===============

package fontes;
import javax.ejb.Remote;

@Remote
public interface HelloWorldLocal {
public String hello();

}

==================

package fontes;

import javax.ejb.Stateless;

/**

  • Session Bean implementation class HelloWorld

*/
@Stateless

public class HelloWorld implements HelloWorldLocal {

/**
 * Default constructor. 
 */
public HelloWorld() {
    // TODO Auto-generated constructor stub
}

@Override
public String hello() {		
	System.out.println("Primeiro EJB Funcionando");
	return "Hello, World!";
}

}

================

package fontes;

import javax.naming.*;

public class HelloClient {

/**
 * @param args
 * @throws NamingException 
 */
public static void main(String[] args) throws NamingException {
	// TODO Auto-generated method stub
	try {
		Context ctx = new InitialContext();
		HelloWorldLocal hello = (HelloWorldLocal) ctx.lookup("fontes.HelloWorldLocal");
		System.out.println(hello.hello());
	}catch (NamingException ex) {
		ex.printStackTrace();
	}
	
}

}

==============

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
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at fontes.HelloClient.main(HelloClient.java:15)

Pede ajuda para o SENSATO uhauhauhauhauh!

seu cliente do ejb precisa das propriedades do innitialContext

eu também não manjo muito de ejb, mais pelo que eu aprendi, você deve criar o innitialContext passando um properties, ou map (não lembro direito se pode ser map)com as configurações:

se você tiver usando o JBOSS na sua própria maquina acho que ficaria alguma coisa ± assim:

    [code]Properties env = new Properties(); 
    env.put(Context.SECURITY_PRINCIPAL, "guest" ); 
    env.put(Context.SECURITY_CREDENTIALS, "guest" );         
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
                  "org.jboss.security.jndi.JndiLoginInitialContextFactory"); 
    env.put(Context.PROVIDER_URL, "jnp://localhost:1099");

    try { 
           Context ctx = new InitialContext(env); 
           ...[/code]

e outra coisa, coloque seus códigos entre as tags code

Funcionou cara.

Obrigado

Amigão,

Vc pode usar a anotação @EJB para fazer o lookup e não ter q escrever este monte de código :

Properties env = new Properties();
env.put(Context.SECURITY_PRINCIPAL, “guest” );
env.put(Context.SECURITY_CREDENTIALS, “guest” );
env.put(Context.INITIAL_CONTEXT_FACTORY,
“org.jboss.security.jndi.JndiLoginInitialContextFactory”);
env.put(Context.PROVIDER_URL, “jnp://localhost:1099”);

Este monte de código fica uma bagunça!

Abraço.

cara… valeu pela dica… mas não consegui rodar… como ficaria meu código?

public static void main(String[] args) throws NamingException {

	/*Properties env = new Properties();   
    env.put(Context.SECURITY_PRINCIPAL, "guest" );   
    env.put(Context.SECURITY_CREDENTIALS, "guest" );           
    env.put(Context.INITIAL_CONTEXT_FACTORY,   
                  "org.jboss.security.jndi.JndiLoginInitialContextFactory");   
    env.put(Context.PROVIDER_URL, "jnp://localhost:1099");*/
	try {
		//Context ctx = new InitialContext(env);
		Context ctx = new InitialContext();
		HelloWorldLocal hello = (HelloWorldLocal) ctx.lookup("HelloWorldLocal/remote");
		System.out.println(hello.hello());		
	
	}catch (NamingException ex) {
		ex.printStackTrace();
	}
	
}

===============
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
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at fontes.HelloClient.main(HelloClient.java:31)


Cara… desse forma funciona…

Eu voltei a postar pelo fato de terem me dito em post posterior… Quero saber como utilizar o @EJB

[i]Vc pode usar a anotação @EJB para fazer o lookup e não ter q escrever este monte de código :

Properties env = new Properties();
env.put(Context.SECURITY_PRINCIPAL, “guest” );
env.put(Context.SECURITY_CREDENTIALS, “guest” );
env.put(Context.INITIAL_CONTEXT_FACTORY,
“org.jboss.security.jndi.JndiLoginInitialContextFactory”);
env.put(Context.PROVIDER_URL, “jnp://localhost:1099”);

Este monte de código fica uma bagunça!

Abraço[/i]

Não consegui rodar utilizando annotation @EJB

Qual erro que tá acusando?

Só um palpite:
acredito que o lookup correto seria dessa forma:

Context ctx = new InitialContext();
HelloWorldLocal hello = (HelloWorldLocal) ctx.lookup("HelloWorldLocal/remote");
System.out.println(hello.hello()); 

Tente assim:

public static void main(String[] args) throws NamingException {
		
		try {
                        Properties env = new Properties();   
                        env.put(Context.SECURITY_PRINCIPAL, "guest" );   
                        env.put(Context.SECURITY_CREDENTIALS, "guest" );           
                        env.put(Context.INITIAL_CONTEXT_FACTORY,  "org.jboss.security.jndi.JndiLoginInitialContextFactory");   
                        env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
			Context ctx = new InitialContext(env);
			HelloWorldLocal hello = (HelloWorldLocal) ctx.lookup("HelloWorldLocal/remote");
			System.out.println(hello.hello());		
		
		}catch (NamingException ex) {
			ex.printStackTrace();
		}
		
	}

Se der errado, favor colocar o erro, se der certo não esqueça do RESOLVIDO no titulo do topico, ok? :lol:

.