Olá a todos.
Pessoal eu estou tentando usar a anotação @EJB mas esto recebendo um erro de NullPointerException!
Eu estou usando o EJB 3 com jboss-4.2.2.GA.
Vejam os detalhes do meu cógido:
Interface:
package business;
import javax.ejb.Local;
import dto.Aluno;
import dto.Curso;
@Local
public interface MatriculaLocal {
public void processarPagamento(Curso curso, Aluno aluno);
}
Bean:
package business.implementation;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
import business.MatriculaLocal;
import dto.Aluno;
import dto.Curso;
@Stateless
public class MatriculaBean implements MatriculaLocal {
public void processarPagamento(Curso curso, Aluno aluno) {
System.out.println("Processando pagamento do curso: " +curso.getDescricao() );
}
// Métodos do ciclo de vida
@PostConstruct
public void initialize() {
System.out.println("Bean MatriculaBean criado! @PostConstruct executado! ");
}
@PreDestroy
public void exit() {
System.out.println("Bean MatriculaBean será destruido! @PreDestroy executado! ");
}
}
Cliente - que é um Servlet:
package cliente;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Hashtable;
import java.util.Properties;
import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import business.Cadastrar;
import business.MatriculaLocal;
import dto.Aluno;
import dto.Categoria;
import dto.Curso;
public class ClienteServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
public ClienteServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Hashtable prop = new Hashtable();
prop.put(Context.SECURITY_PRINCIPAL, "guest" );
prop.put(Context.SECURITY_CREDENTIALS, "guest" );
prop.put(Context.INITIAL_CONTEXT_FACTORY,"org.jboss.security.jndi.JndiLoginInitialContextFactory");
prop.put(Context.PROVIDER_URL, "jnp://localhost:1099");
Context ctx;
try {
ctx = new InitialContext(prop);
MatriculaLocal matricula = (MatriculaLocal)ctx.lookup("MatriculaBean/local");
Aluno aluno = new Aluno("Rafael Frantz","rfrantz@acme.com");
Curso c1 = new Curso("TUML00", "UML", 20, 350.50f);
matricula.processarPagamento(c1, aluno);
System.out.println("Objeto pacote curso recuperado ...");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Este código mostado acima funciona perfeitamente! Mas quando eu altero para usar @EJB, o gera erro.
Veja o código:
Bean
@Stateless(name="MatriculaBeanLocal")
Cliente:
@EJB(name="MatriculaBeanLocal")
private MatriculaLocal matricula;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Aluno aluno = new Aluno("Rafael Frantz","rfrantz@acme.com");
Curso c1 = new Curso("TUML00", "UML", 20, 350.50f);
matricula.processarPagamento(c1, aluno);
System.out.println("Objeto pacote curso recuperado ...");
}
Alguêm sabe o que pode ser? Eu estou achando que o cliente perde a referência pois não encontra o valor prop.put(Context.PROVIDER_URL, “jnp://localhost:1099”) que fica no contexto.