Solução JNDI Glassfish - CarrinhoBean

12 respostas
A

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

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();
}
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;
    }
}
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");
    }
}

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\ .

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();
		
	}
}

Fonte : https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB

Até a próxima,
Bom fim de semana a todos!

12 Respostas

G

Amigo [email removido] [email removido],
vc chegou a testar essa parte gf-client.jar
eu não consegui fazer funcionar
vc tem um exemplo funcional ai que vc possa me mandar?

A

Boa Tarde Giofranceno,

Cheguei a fazer o exemplo sim .
Estou no trabalho e não tenho os fontes aqui, mas assim que chegar em casa lhe envio.

Abraços!

G

fico muito grato, AdemarJr.

Obrigado mesmo, estou com uma dificuldade enorme com isso.

se puder envie o exemplo no e-mail: [email removido]

Valeu, t+.

A

Beleza a noite lhe envio,
Abraços !

G

Ademar Jr,

Eu vi que você colocou no classpath do applicativo cliente gf-client-module.jar,
mas no meu caso não funcionou, rodando o aplicativo fora do NetBeans.

java -jar nomedaaplicacao.jar

o erro que acontece é esse:
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

Obs.: Pelo NetBeans ele funciona normalmente

Você sabe o que pode ser?

Agradeço desde já, t+.

A

Boa noite Amigo,

se você empacotar seu loja-client em um cliente enterprise vc pode executar o seguinte comando:

appclient -client <seu_projeto.jar>

Até mais !

G

Opa,

Boa noite Amigo
Agora funcionou mas somente na maquina em que o servidor está Iniciado,
Não consigo executar esse mesmo .jar em outra máquina,
conectando neste servidor iniciado em outra máquina.

vc sabe o que pode ser?
Obrigado.

T

Simples, no InitialContext você precisa especificar qual a máquina e porta que seu serviço está disponível.

Properties props = new Properties();
 props.setProperty(InitialContext.PROVIDER_URL, 192.168.0.12:1099); //endereço da maquina e a porta. Por padrão a porta a se utilizar é a 1099

 InitialContext ic = new InitialContext(props);  //instancia o InitialContext  e prossegue com o lookup em seguida.
G

a porta padrão do glassfish não é a 3700?

T

Verdade.
1099 é do JBoss.

G

Ademar Jr.

Estou com um problema, não quero chamar minha aplicação através do console "appclient -client Projeto.jar"
como faço para não precisar chamar pelo console?

desde já agradeço a compreensão, obrigado.

E

Aproveitando o tópico…
Nâo estou conseguindo criar um EJBContainer… Estou seguindo um exemplo do mesmo llink que foi posto como fonte do primeiro exemplo do post. Já botei o glassfish-embedded-static-shell.jar no classpath do cliente porém continua dando o seguinte erro:

Exception in thread "main" javax.ejb.EJBException: No EJBContainer provider available: no provider names had been found. at javax.ejb.EJBContainer.reportError(EJBContainer.java:180) at javax.ejb.EJBContainer.createEJBContainer(EJBContainer.java:117) at javax.ejb.EJBContainer.createEJBContainer(EJBContainer.java:77) at br.com.arenasoft.ejb.main.PrincipalEJBContainer.main(PrincipalEJBContainer.java:11)

Alguem saberia dizer o que eu posso estar fazendo errado?

Criado 24 de outubro de 2010
Ultima resposta 3 de nov. de 2010
Respostas 12
Participantes 4