Criando um projeto EJB no NetBeans

Criando o módulo EJB

Para começar crie um Novo Projeto, na aba Categorias selecione Java EE e na aba Projetos selecione Módulo EJB, conforme a figura ProjetoEJB01.

Projeto EJB

Clique em Próximo > para continuar a criação do projeto. Na tela de Novo Módulo EJB apresentada na figura a seguir, no campo Nome do projeto digite HelloWorldEJB e informe o Local do projeto de sua preferência.

Projeto EJB

Clique em Próximo > para continuar a criação do projeto. Agora selecione o Servidor que será usado para publicar o projeto EJB nesse exemplo usaremos o Glassfish Server 3.1 e a Versão do Java EE usada será a Java EE 6, conforme a figura a seguir:

Projeto EJB

Clique em Finalizar para terminar a criação do projeto. A Figura a seguir apresenta como é a estrutura inicial do projeto gerado pelo NetBeans:

Projeto EJB

Criando um EJB Stateless Session Bean

Crie a interface HelloWorldRemote no pacote pbc.ejb e adicione a assinatura do método public abstract String ola().

package pbc.ejb;

import javax.ejb.Remote;

@Remote
public interface HelloWorldRemote {
    public abstract String ola();
}

Nesta interface adicione a anotação @Remote para informar que ela será acessada remotamente.

Agora vamos implementar esta interface, crie uma classe chamada HelloWorldBean no mesmo pacote e implemente o método ola().

package pbc.ejb;

import javax.ejb.Stateless;

@Stateless
public class HelloWorldBean implements HelloWorldRemote {
    public String ola() {
        return "Ola mundo com EJB.";
    }
}

Nesta classe adicione a anotação @Stateless para informar que ela será um componente EJB do tipo Stateless Session Bean.

Publicando o projeto EJB no Glassfish

Após criar o projeto EJB é necessário publicá-lo em um servidor web para poder acessar os componentes EJB. Para isso clique com o botão direito sobre o projeto HelloWorldEJB e escolha a opção Implantar, conforme a Figura ProjetoEJB05; se o servidor web GlassFish não estiver iniciado, o NetBeans irá iniciá-lo e publicará o projeto EJB nele.

Projeto EJB

Depois que terminar de iniciar o Glassfish, aparecerá a seguinte mensagem no console de saída:

INFO: Portable JNDI names for EJB HelloWorldBean :
[java:global/HelloWorldEJB/HelloWorldBean!pbc.ejb.HelloWorldRemote,
java:global/HelloWorldEJB/HelloWorldBean]
INFO: Glassfish-specific (Non-portable) JNDI names for EJB
HelloWorldBean : [pbc.ejb.HelloWorldRemote#pbc.ejb.HelloWorldRemote,
pbc.ejb.HelloWorldRemote]
INFO: HelloWorldEJB was successfully deployed in 11.478
milliseconds.

Caso ocorra algum problema ao tentar publicar a aplicação no servidor web GlassFish, será apresentado neste console as mensagens dos erros.

Criando um Projeto Java Console para testar o EJB

Para testar o componente EJB crie um projeto console. No NetBeans crie um Novo projeto, na aba Categorias selecione Java, e na aba Projetos selecione Aplicativo Java e clique em Próximo, conforme a figura a seguir:

Projeto EJB

Na janela Novo Aplicativo Java, deixe o Nome do projeto como HelloWorld e na Localização do projeto, defina a mesma pasta que foi criado o projeto EJB HelloWorldEJB, conforme a figura a seguir:

Projeto EJB

Antes de começar a desenvolver o cliente do EJB, é necessário adicionar algumas bibliotecas (jar) no projeto, estas bibliotecas serão utilizadas para fazer o lookup do EJB.

Clique com o botão direito no projeto HelloWorld e escolha o item Propriedades. Na tela de Propriedades do projeto, apresentada na figura a seguir, selecione a categoria Bibliotecas e clique no botão Adicionar JAR / Pasta.

Projeto EJB

Na janela Adicionar JAR / Pasta navegue até a pasta de instalação do Glassfish e entre no diretório /glassfish-vX/glassfish/modules/, conforme apresentado na figura a seguir:

Projeto EJB

Selecione gf-client.jar ou gf-client-module.jar e clique em Selecionar.

Também é preciso adicionar uma referência entre os projetos. Na mesma tela de Biblioteca, clique no botão Adicionar projeto... e selecione o projeto HelloWorldEJB e clique em OK. Esta referência entre os projetos serve para referenciar as classes e interfaces, como, por exemplo, a interface HelloWorldRemote.

Na pasta Pacotes de códigos-fontes, crie a classe TesteEJB no pacote pbc.teste, que será utilizada para testar o EJB HelloWorldRemote.

package pbc.teste;

import pbc.ejb.HelloWorldRemote;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * Classe utilizada para testar o EJB de HelloWorldRemote.
 */
public class TesteEJB {
  public static void main(String[] args) {
    try {
      //Método que faz o lookup para encontrar o EJB de HelloWorldRemote.
      InitialContext ctx = new InitialContext();
      HelloWorldRemote ejb = (HelloWorldRemote) ctx.lookup
        ("pbc.ejb.HelloWorldRemote");

      System.out.println(ejb.ola());

    } catch (NamingException ex) {
      ex.printStackTrace();
      System.out.println("Não encontrou o EJB.");
    } catch (Exception ex) {
      ex.printStackTrace();
      System.out.println(ex.getMessage());
    }
  }
}

No método main() foi criado um objeto do tipo javax.naming.InitialContext que possui o método lookup utilizado para obter uma instância do EJB, após pedir uma instância do EJB ctx.lookup("pbc.ejb.HelloWorldRemote") é chamado o método ola(), que devolve a mensagem definida no componente EJB.

Repare que para pedir um EJB para o GlassFish é utilizado o método lookup passando o nome completo da classe remota do EJB, também é possível fazer o lookup especificando o projeto e módulo, por exemplo: java:global[/<app-name>]/<module-name>/<bean-name>.

A figura a seguir apresenta a estrutura atual do projeto.

Projeto EJB

Testando o EJB

Para testar o EJB, execute a classe TesteEJB do projeto HelloWorld. Será apresentada a seguinte saída no console.

Ola mundo com EJB.

Se o Glassfish estiver instalado em outra maquina ou a porta padrão 3700 for alterada é possível criar um arquivo de propriedades através da classe java.util.Properties para definir estas informações, como por exemplo:

package pbc.teste;

import pbc.ejb.HelloWorldRemote;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * Classe utilizada para testar o EJB de HelloWorldRemote.
 */
public class TesteEJB {
  public static void main(String[] args) {
    try {
      /* Monta um objeto Properties com as informações 
        para localizar o Glassfish. */
      Properties props = new Properties();
      props.put("org.omg.CORBA.ORBInitialHost", "localhost");
      props.put("org.omg.CORBA.ORBInitialPort", "3700");

      /* Método que faz o lookup para encontrar o EJB 
        de HelloWorldRemote. */
      InitialContext ctx = new InitialContext(getProperties());
      HelloWorldRemote ejb = (HelloWorldRemote) ctx.lookup
        ("pbc.ejb.HelloWorldRemote");

      System.out.println(ejb.ola());
    } catch (NamingException ex) {
      ex.printStackTrace();
      System.out.println("Não encontrou o EJB.");
    } catch (Exception ex) {
      ex.printStackTrace();
      System.out.println(ex.getMessage());
    }
  }
}

Melhorando o lookup

Para melhorar a forma de fazer lookup existe um padrão de projeto chamado Service Locator, que consiste em deixar genérica a forma como é feito o lookup do EJB.

O padrão Service Locator serve para separar a lógica envolvida no lookup das classes que precisam utilizar o EJB.

A seguir, será criada uma classe chamada ServiceLocator, está classe será responsável por fazer um lookup de forma genérica, note que a natureza desta classe é altamente coesa, ou seja seu objetivo é bem definido: fazer o lookup do EJB.

package pbc.util;

import java.util.Properties;
import javax.naming.InitialContext;

/**
 * Classe utilizada para fazer um lookup genérico do EJB.
 */
public class ServiceLocator {

  /**
   * Propriedades do Glassfish.
   */
  private static Properties properties = null;

  /**
   * Monta um objeto Properties com as informações para 
   * localizar o glassfish.
   * @return
   */
  private static Properties getProperties() {
    if (properties == null) {
      properties = new Properties();
      properties.put("org.omg.CORBA.ORBInitialHost", "localhost");
      properties.put("org.omg.CORBA.ORBInitialPort", "3700");
    }
    return properties;
  }

  /**
   * Método que faz o lookup generico de um EJB.
   *
   * @param <T>
   * @param clazz - Classe que representa a interface do 
   *   EJB que será feito o lookup.
   * @return
   * @throws Exception
   */
  public static <T> T buscarEJB(Class<T> clazz) throws Exception {
    /* Cria o initial context que faz via JNDI a procura do EJB. */
    InitialContext ctx = new InitialContext(getProperties());

    /* Pega o nome completo da interface utilizando 
      reflection, faz o lookup do EJB e o retorno do EJB. */
    return (T) ctx.lookup(clazz.getName());
  }
}

Agora a classe que utiliza o EJB, não precisa mais saber como fazer o lookup do EJB, precisa apenas chamar o método buscarEJB da classe ServiceLocator passando como parâmetro a Class da interface do EJB.

package pbc.teste;

import pbc.ejb.UsuarioRemote;
import aula.util.ServiceLocator;

/**
 * Classe utilizada para testar o EJB de HelloWorldRemote.
 */
public class TesteEJB {
  public static void main(String[] args) {
    try {
      HelloWorldRemote ejb = (HelloWorldRemote)
        ServiceLocator.buscarEJB(HelloWorldRemote.class);

      System.out.println(ejb.ola());
    } catch (Exception ex) {
      System.out.println(ex.getMessage());
    }
  }
}

Existem outras vantagens de utilizar o Service Locator para separar a lógica do lookup, por exemplo: um Proxy para caso seja necessário gravar algum log quando criar o EJB ou quando seus métodos são chamados.

results matching ""

    No results matching ""