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:

results matching ""

    No results matching ""