Lookup de EJB 3.0 Remoto

O que faltava que dava este erro? Um JAR do JBoss no client?

Exato. Há um JAR que eu não lembro bem o nome, mas acho que tem “aop” no meio. Bastou inclui-lo que o erro sumiu =]

Cara, como eu faço pra usar ID em um arquivo java executável (com um método main)?

Estou perguntando por que programo da seguinte maneira: crio as classes na IDE, deplos executo o servidor, faço o deploy e executo a classe main à partir da IDE depois do deploy. O que eu acho que acontece é que, através da JNDI, a classe consegue encontrar o bean que eu solicitei e o executa - e como ele executa na IDE, não há como utilizar ID, como você disse anteriormente.

Mas como eu utilizo o @EJB em uma classe com um método main?

Obrigado =]

ID? Que ID?

Sobre o @EJB, creio que só dentro do próprio container. Não sei se há uma maneira de configurar para ele injetar recursos de um container remoto.

Injeção de Dependência
Devia ter falado, foi mal =]

Será que se eu deployar o JAR e executar com “java -jar …” a ID funciona?

Não funciona…

Quando você executa um programa stand-alone (que contém o main), você não tem as funcionalidades implementadas do container, a não ser que use as configurações (por exemplo do Spring).

Daniel, acho que deve ter uma maneira de usar @EJB remotamente. O próprio exemplo da Sun tem o seguinte código:

package enterprise.security_stateless_appclient;

import javax.ejb.EJB;
import enterprise.security_stateless_ejb.Sless;

public class SlessAppClient {
    @EJB private static Sless sless;

    public static void main(String args[]) {
        System.out.println(sless.helloRolesAllowed());

        try {
             sless.helloRolesAllowed2();
             throw new IllegalStateException(
                 "Unexpected succesful call for helloRolesAllowed2()");
        } catch(Exception ex) {
             System.out.println("Expected Exception for sless.helloRolesAllowed2()");
        }

        System.out.println(sless.helloPermitAll());

        try {
             sless.helloDenyAll();
             throw new IllegalStateException(
                 "Unexpected succesful call for helloDenyAll()");
        } catch(Exception ex) {
             System.out.println("Expected Exception for sless.helloDenyAll()");
        }
    }
}

Fonte:
http://java.sun.com/javaee/reference/code/

Já ví outros exemplos usando @EJB remotamente. Estou correndo atrás disso também se achar a resposta mando aqui…

Já achei. O Jboss não fornece um client container.

http://www.jboss.com/index.html?module=bb&op=viewtopic&t=86803

Estou seriamente tentado a migrar para o GlassFish. Ele suporta o client container. Alguém já está usando o GlassFish? Só fico preocupado se ele não tiver ferramenta para o Eclipse.

Abraços!

Eita… isso realmente responde tudo.
Eu vou tentar rodar no GlassFish também.
Como eu não uso o Eclipse não vou me preocupar com isso =D
Mas se não tiver suporte direto para o Eclipse, roda um Ant! =P

E obrigado a todos! :smiley:

E aquela parada do JBoss rodar EJB 3.0 fora do container? Não resolve?

Acho que isso não o transforma em um “Client Container”, já que uma das premissas dele é ser “lightweight”.

E outra, carregar um Embeddable JBoss pra dentro dos meus clientes que são Swing é um pouco demais.

É uma falta grave da comunidade JBoss não investir num “Client Container”. Spring e Glassfish saem na frente…

O que eu tento fazer e nunca dá certo, sempre dá nullpointexception:

No netbeans eu tenho 2 projetos. 1 EJB3 (CalcEJB) e 1 Cliente (CalcCliente)

Crio um simples beans stateless chamado Calc e implemento as interfaces remote e local com o método int soma(int a, int b).

No projeto cliente eu chamo o EJB:
@EJB
private static …remote …

Tenho um JFrame com 3 edits e 1 botão, os dois edits passam os inteiros e o terceiro edit teoricamente recebe o resoltado, o botão chama o método:
…remote.soma(…)

Rodo o glassfish e faço o deploy dos 2 projetos

Quando executo o cliente sempre dá um NullPointException

Lí em vários tutoriais que o EJB3 dispensa o uso de lookups. Alguém sabe como posso resolver isso. Indicar algum tutorial?

Obrigado.

Pois então Rodrigo, essa foi exatamente a dúvida que eu cheguei nesse fórum com. Eu também li que o EJB3 dispensava o uso de lookups, mas não funcionou de jeito nenhum. O lookup tá bem mais simples, não precisa mais de um home e nem de um “narrow”, mas eu ainda tow precisando fazer o lookup.

O que o daniel falou me acordou pra um fato: se eu estou usando o netbeans, faço o deploy e depois executo um arquivo main NO NETBEANS utilizando @EJB, este arquivo não está sendo executado dentro do container, logo não pode receber a instância do bean por injeção. Dai eu me perguntei “e como diabos ele conseguiria usar a injeção de dependencia do container no cliente?”. Dai o pessoal veio com a resposta de que o JBoss - o que eu tow usando - não tem Client Container.

Tá meio nebuloso ainda pra mim =]

Então eu só posso usar dependence injection se o AS tiver client container? Mas o glassfish já não tem isso? Pq não funciona? É meio confuso mesmo.

Obrigado.

É simples. Dependency Injection (DI) só funciona dentro do container que implementa a especificação EJB 3.0.

Fora do container, não tem um mecanismo padrão que já faça isso, portanto é necessário usar algum recurso que permita isso, por exemplo esse tal de Client Container que tem no Glassfish. Porém é necessário que isto seja configurado e utilizado na sua aplicação. Do nada isso não funciona mesmo.

É como tentar fazer conexão ao BD sem usar um driver apropriado. Énecessário prover a implementação de acesso ao BD para funcionar.

Com a DI é a mesma coisa. Tem de existir uma implementação que faça isso funcionar.

Entendi, notei que no glassfish só posso rodar a aplicação cliente swing por um link usando JWS, acho que é assim que ele implementa o cliente container.

Realmente se vc for parar para pensar, como uma aplicação swing normal vai saber qual o endereço da máquina do servidor de aplicação? Não tem como, só com jws mesmo.

Archon, vc poderia me mandar um projeto de exemplo no netbeans usando DI, mesmo que seja o JBoss?

Se você executar o cliente na mesma máquina em que está o servidor Glassfish, use o comando appclient -client <AplicacaoCliente.jar>.

Se for executar remotamente, é possível obter o Client Container através do comando package-appclient . Daí, é só extrair o conteúdo do appclient.jar e configurar alguns arquivos.

Links sobre o assunto que achei interessantes:
http://blogs.sun.com/pblaha/entry/ejb_3_0_client_in
http://docs.sun.com/source/817-6092/hman1m/appclient.1m.html
http://docs.sun.com/source/817-6092/hman1m/package-appclient.1m.html
http://docs.sun.com/app/docs/coll/134.4

Isso ajudou?

No entanto, estou tendo problemas para executar qualquer cliente remoto que lide com transações. Consigo criar os Entity Beans, mas na hora em que chamo sessionBean.create(myEntityBean), por exemplo, ele lança uma excessão.

Vai saber…

Se bem que quando utiliza -retrieve ele volta toda a aplicação, não apenas as classes do cliente e os ejb’s com os quais se relaciona, como, por exemplo, a implementação de um Business Delegate.

Tem que ter um jeito de voltar só o essencial…

Esse forum é demais… vcs detonaram o EJB… ou quase no meu caso !!

Seguinte tenho um EJB3 rodando, com um método lá… coisa simples…
quando tendo chamar ele de uma aplicação web (struts,tiles,jsp,etc…) a partir da action… testeEjb.

public String testeEjb() throws Exception {

		Properties properties = new Properties();
 		properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
 		properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
		properties.put("java.naming.provider.url","localhost:1099");
 			
		Context context = new InitialContext(properties);
		
		Object home = context.lookup("ConsultaCEPBean/remote");
		
				

		System.out.println(context.lookup("ConsultaCEPBean/remote"));
		System.out.println("teste");
		
		return SUCCESS;
	}

A pergunta é a seguinte como eu executo os métodos que estam dentro do
objeto home?
Object home = context.lookup(“ConsultaCEPBean/remote”);

Se tiver outra forma, me avisa…

desde já obrigado !!!

EJB 3 não tem interface home.

Srs;

Estou tendo um problema aqui e desconfio do seguinte:

Estou fazendo um EJB com o Hibernate sem Anotations, ou seja com o mapeamento feito via xml e esta retornado uma série Exception. A dúvida é, será que isso ocorre porque o Hibernate com EJB3 deve-se usar Anotations?

Desde já obrigado !