Usando a anotação @EJB
Quando queremos acessar um EJB A a partir de outro EJB B podemos utilizar a anotação @EJB, através desta anotação o Container EJB faz o lookup do EJB A e guarda sua referencia no EJB B, isso é chamado de Injeção de Dependência.
O Servidor Web Glassfish estende um pouco mais a utilização desta anotação, se temos um cliente que é uma Aplicação Web, ao utilizarmos Servlets podemos também usar a anotação @EJB para que seja feito o lookup do EJB.
No exemplo a seguir, crie uma Servlet e utilize a anotação @EJB para que o servidor web atribua uma referência do EJB AlunoRemote, depois chame um método do EJB e deixe a servlet retornar um HTML.
Exemplo:
A seguir, crie a interface remota do EJB, que possui a assinatura do método consultarMediaFinal.
package aula.ejb;
import javax.ejb.Remote;
/**
* Interface remota para o EJB de Aluno.
*/
@Remote
public interface AlunoRemote {
/**
* Método utilizado para consultar a média final
* de um aluno.
*
* @param matricula - Matricula do aluno utilizado
* para a consulta.
* @return Media final do aluno.
*/
public Double consultarMediaFinal(String matricula);
}
A seguir crie o EJB do tipo Stateless, que é responsável por implementar o método consultarMediaFinal que retorna um número randômico.
package aula.ejb;
import javax.ejb.Stateless;
/**
* Session Beans Stateless que implementa as
* funcionalidades referentes a aluno.
*/
@Stateless
public class AlunoBean implements AlunoRemote {
/**
* Método utilizado para consultar a média final
* de um aluno.
*
* @param matricula - Matricula do aluno utilizado
* na consulta.
* @return Média final do aluno.
*/
public Double consultarMediaFinal(String matricula) {
/* Implementação de exemplo
Retorna um número randomico entre 0 e 10. */
return Math.random() * 10;
}
}
A seguir, declare uma Servlet para testar o EJB de Aluno.
package aula.servlet;
import aula.ejb.AlunoRemote;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet utilizada para testar o EJB de Aluno.
*/
public class AlunoServlet extends HttpServlet {
private static final long serialVersionUID =
-1359012378400126336L;
@EJB
private AlunoRemote ejb;
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println(" <head>");
out.println(" <title>Teste @EJB + Servlet</title>");
out.println(" </head>");
out.println(" <body>");
out.println(" <h1>Consultando a média do aluno.</h1>");
out.println(" </br>");
out.println(ejb.consultarMediaFinal("123456"));
out.println(" </body>");
out.println("</html>");
} finally {
out.close();
}
}
}
Está é a Servlet que usa o EJB de Aluno, note que foi declarado um atributo do tipo AlunoRemote que é a interface remota do EJB, e foi utilizado a anotação @EJB nesse atributo.
Quando chamar esta Servlet o próprio servidor web coloca uma instância do EJB AlunoBean no atributo ejb.
Depois de publicar o EJB e o Servlet, quando chamar a URL do Servlet temos a seguinte saída: