lundi 1 octobre 2007

Exemplo de uso de EJB

Vamos criar neste exemplo um simples componente que converte um valor em dólares para reais.Para realizar o exemplo, utilizamos NetBeans versão 6.0 e Sun Java System Application Srever 9.0. Supomos que para seguir esse exemplo, você possua conhecimento de Java e esteja habituado ao uso do NetBeans.

Após certifica-se que o NetBeans esta configurado junto com o servidor . Crie um novo projeto no NetBeans e selecione Enterprise e depois EJBModule. Coloque o nome de EJBModuleConversor e escolha o servido do J2EE como servidor de aplicação.

Após a criação do projeto, clique com o botão direito sobre o projeto EJBModuleConversor e selecione New->SessionBean. Coloque o nome de Conversor e selecione interface Remote. Atribua um nome ao pacote (conversor) e selecione finish. Duas classes foram geradas para implementar o seu SessionBean: ConversorRemote e ConversorBean.

A classe ConversorRemote possui a anotação @Remote para indicar que ela representa a interface remota do componente. Nesta interface, devem ser declarados os métodos a serem implementados pelo SessionBean (i.e., ConversorBean) e que serão acessíveis através do contêiner. Após a geração a classe ConversorRemote contém o seguinte código:

package conversor;

import javax.ejb.Remote;

/**

* This is the business interface for Conversor enterprise bean.

*/

@Remote

public interface ConversorRemote {

}

Vamos alterar esse código adicionado a descrição de um “serviço” de conversão de moedas. O método calcularConversão:

@Remote

public interface ConversorRemote {

public double calcularConversao(double d);

}


Altere o código da classe ConversorBean para que ele implemente o método de conversão e exporte o componente com o nome de ejb/Conversor. No fim, ele deve ficar assim:

package conversor;

import javax.ejb.Stateless;

@Stateless (mappedName="ejb/ConversorDeMoedas")

public class ConversorBean implements conversor.ConversorRemote {

/** Creates a new instance of ConversorBean */

private double tax;

public ConversorBean() {

tax=1.8;

}

public double calcularConversao(double d) {

return d*tax;

}}

Esse código indica que o componente é do tipo Stateless SessioBean e que ele pode ser localizado através do nome ejb/Conversor. Compile o projeto e instale no servidor Sun Java Application Server. Para realizar esta tarefa, clique com o botão direito sobre o projeto e selecione Deploy. As ultimas linhas do console do Sun Java Application Server devem ser:

**RemoteBusinessJndiName: ejb/ConversorDeMoedas; remoteBusIntf: conversor.ConversorRemote

LDR5010: All ejb(s) of [EJBModuleConversor] loaded successfully!


Agora vamos criar um cliente para este componente. Crie um novo projeto e selecione Enterprise Aplication Client. Coloque o nome de ConversorDeMoedasCliente. Selecione com o botão direito as propriedades do novo projeto (Properties). Selecione Libraries e depois clique em Add Jar/Folder. Navegue até a pasta onde se encontrar o .jar do componente Conversor (EJBModuleConversor.jar). Após a criação do projeto e da configuração dos imports, modifica o método main da classe Main até obter o seguinte código:


public static void main(String[] args) {

InitialContext ctxt;

try {

ctxt=new InitialContext();

ConversorRemote clienteCR=(ConversorRemote)ctxt.lookup("ejb/ConversorDeMoedas");

System.out.println("#########################");

System.out.println("10 dolares equivalem à "+clienteCR.calcularConversao(10)+" reais ");

System.out.println("#########################");

} catch (NamingException ex) {

ex.printStackTrace();

}}


Aceite os imports necessários e compile a aplicação. Execute o cliente (Run Project) e você deve obter o seguinte resultado:

#########################

10 dólares equivalem à 18.0 reais

#########################


Pequena explicação

O cliente acessa o componente através do contêiner. Para isso, uma instância da classe InitialContext é usada. O método lookup é invocado com o nome publicado pelo componente servidor (i.e.,“ejb/ConversorDeMoedas”). Uma referência do objeto é repassada pelo contêiner ao objeto clienteCR. Esta referência permite o acesso ao método remoto calcularConversao.

3 commentaires:

JP a dit…

Esse seu exemplo gera o seguinte erro na funcao main:

Exception in thread "main" 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(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:284)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at TestJndi.main(TestJndi.java:27)

Windson Viana a dit…

Ola Joao Paulo, eu testei o exemplo usando as ferramentas que descrevo no inicio do texto. Eu posso lhe enviar inclusive o codigo do projeto do netbeans.

Kiko a dit…

vc deve importar as seguintes bibliotecas no main.java

import javax.naming.InitialContext;
import javax.naming.NamingException;