Boa tarde amigos,
tive dificuldades para efetuar lookup de um EJB no glassfish com uma aplicação standalone e percebi que muitos também tiveram o mesmo problema.
Encontrei a solução e achei por bem compartilhar rs… !
livraria-base.jar:
br/com/caelum/livraria/ejb/Carrinho.class
br/com/caelum/livraria/modelo/Livro.class
livraria-ejb.jar
br/com/caelum/livraria/CarrinhoBean.class
livraria.ear
|+ META-INF
|+ livraria-ejb.jar
|+ livraria-base.jar
[code]package br.com.caelum.livraria.ejb;
import java.util.List;
import br.com.caelum.livraria.modelo.Livro;
public interface Carrinho{
void addLivro(Livro livro);
List<Livro> getLivros();
double getTotal();
void finalizaCompra();
} [/code]
[code]package br.com.caelum.livraria.modelo;
import java.io.Serializable;
public class Livro implements Serializable {
private static final long serialVersionUID = 1L;
private String nome;
private double preco;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getPreco() {
return preco;
}
public void setPreco(double preco) {
this.preco = preco;
}
}[/code]
[code]package br.com.caelum.livraria.ejb;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PreDestroy;
import javax.ejb.Remote;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import br.com.caelum.livraria.modelo.Livro;
@Stateful
@Remote(Carrinho.class)
public class CarrinhoBean implements Carrinho {
private static final long serialVersionUID = 1L;
private List<Livro> livros = new ArrayList<Livro>();
private double total;
@Override
public List<Livro> getLivros() {
return this.livros;
}
@Override
public double getTotal() {
return this.total;
}
@Override
public void addLivro(Livro livro) {
livros.add(livro);
total += livro.getPreco();
System.out.printf("Livro %s adicionado com sucesso!\n", livro.getNome());
}
@Override
@Remove
public void finalizaCompra() {
System.out.println("Finalizando a compra de: ");
for (Livro livro : this.livros) {
System.out.println(livro.getPreco()+" - "+livro.getNome());
}
}
@PreDestroy
public void destroy(){
System.out.println("Removendo uma instancia da Classe do Container");
}
}[/code]
Apicação cliente standalone:
Jboss segundo o exemplo foi efetuado com o jndi.properties no classpath do cliente + bibliotecas do JBoss.
Já no caso do glassfish não é necessário o jndi.properties e a lib no classpath que deve ser utilizado é apenas a gf-client.jar que se enconta no glassfish_home\glassfish\modules\ .
[code]package br.com.caelum.livraria.cliente;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import br.com.caelum.livraria.ejb.Carrinho;
import br.com.caelum.livraria.modelo.Livro;
public class CarrinhoClienteLivraria {
public static void main(String[] args) throws NamingException {
InitialContext ic = new InitialContext();
// Aqui é para o JBoss Carrinho carrinho = (Carrinho) ic.lookup("livraria-ear/CarrinhoBean/remote");
// Glassfish
Carrinho carrinho = (Carrinho) ic.lookup("java:global/livraria-ear/livraria-ejb/CarrinhoBean");
Livro livro = new Livro();
livro.setNome("Alice no País das maravilhas");
livro.setPreco(15.0);
carrinho.addLivro(livro);
System.out.print(carrinho.getTotal());
carrinho.finalizaCompra();
}
}[/code]
Fonte : https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB
Até a próxima,
Bom fim de semana a todos!