Duvida conceitual sobre EJB

16 respostas
kleins

Pessoal

Estou com umas dúvidas conceituais sobre EJB.

Imaginando que eu tenho um sistema Client Web que acessa uma aplicação EJB em um Container JavaEE.

Em muitos posts que vi pela NET, vejo que o pessoal coloca o jar do EJB dentro da aplicação cliente…

A minha primeira pergunta é…

Se coloca o Jar do EJB só durante o desenvolvimento (como referência) ou ele permanece no classpath do cliente em produção ?

A segunda é…

Quando eu estiver utilizando uma aplicação cliente web dentro de um container, ele faz a DI @EJB e eu não preciso fazer lookup… mas e quanto as Entidades de Persistência ? O Container faz o lookup automaticamente quando eu referencio ela e transfere entre cliente/container sozinho ?

Ou seja… eu tenho acesso a todos os objetos da aplicação EJB ?

Valeu galera !

abs

16 Respostas

Penetrol

è o seguinte o cliente so vai presisar das interfaces remotas …

do Cliente pro EJB vc tem q fazer lookup manual
ja de EJB pra EJB so usar @EJB

danieldestro

A injeção de dependência do EJB 3.0 só pode ser usada em objetos gerenciados (Servlets, EJBs). A partir de outrar classes, é necessário fazer o lookup.

Com JPA você não faz lookup das entidades. Pode dar um “new” e persistir via EntityManager ou fazer busca (find) pelo EM.

E para o deploy, use um pacote EAR, que inclui WAR (web) e EJB-JAR (EJBs).

kleins

Daniel.

Com relação a JPA eu entendi mas a minha duvida ainda persiste…

Se a classe anotada está na aplicação EJB, como é que o cliente sabe como é a classe remota?

Por exemplo…

InitialContext ic = new InitialContext();

Object homeObj = ic.lookup(FooEJB);

FooHome fooHome = (FooHome) PortableRemoteObject.narrow(homeObj, FooHome.class);

Foo foo = fooHome.create()

Quando se faz o Cast pra (FooHome), de onde está saindo a referência ? A referência é local, certo ? Eu tenho que ter objetos identicos (DTO) do lado do client ?

Imagina que um EJB me retorne um List (cliente é uma Entidade)…

A aplicação Client não sabe oque é o Objeto Cliente do list… eu teria que ter um Bean DTO no lado da aplicação client tb ?

[]´s

Rodrigo

danieldestro

Este modelo de lookup que você usou é válido até o EJB 2.1 No EJB 3.0 não existe mais a interface HOME.

MeuEJB ejb = context.lookup("nome_jndi_do_ejb");

Você só precisa das interfaces remotas (ou locais), como já disse o “Penetrol”.

E se você empacotar tudo direitinho no EAR (WAR + EJB-JAR), tudo fica disponível no classloader.

kleins

Então por exemplo. (Só pra fechar o meu entendimento)

No NetBeans, quando eu crio o projeto WebAplication acessando um EJB ele coloca nesse projeto a lib do ProjetoEJB.

Nessa lib que o proprio NetBeans coloca, só tem as interfaces e não as classes que implementam elas ?

Imaginando que eu depois crie outras aplicações é só pegar essa mesma lib (com as interfaces) e colocar no novo projeto… certo ?

Valeu Daniel.

[]´s

danieldestro

Não sei se o NetBeans cria isso. Mas se cria, como você disse, é isso aí.

Mas, como eu disse, se a app WEB fica no WAR e este WAR fica no mesmo EAR em que o EJB-JAR fica, não há a necessidade desse jar (lib) que você citou.

Se a app fica fora deste EAR, aí sim você vai precisar.

Isso também dependo do esquema de deploy e o servidor de aplicações que você usa.

kleins

Pelo que percebi também… Nessa lib que o Netbeans coloca na aplicação cliente, contém também os beans de entidade, por isso que se consegue fazer cast com eles também.

Valeu pela ajuda Daniel.

Abs

danieldestro

cast???

kleins

É…

Imagina um EJB que me retorna um List com todos os meus Clientes que é uma entity…

Essa lista de clientes eu vou apresentar em uma tela (da aplicação Client)

Quando eu chamo o EJB vem um List e pra eu apresentar na minha tela vou ter que fazer o cast pra client…

MeuEJB ejb = context.lookup("nome_jndi_do_ejb");
    List<Cliente> cl =  ejb.getClienteList();

Eu teria que ter a entidade “Cliente” tanto na aplicação no container que é onde realmente ela é usada como uma entity de persistência, quanto no Client que eu só uso como Bean… certo ?

abs

danieldestro

Bom, se seu método retorna List<Object> ao invés de List<Cliente> já tem algo errado na sua implementação.

E, sim! Sua app web precisa “enxergar” a classe (entidade) Cliente.

Como eu já disse, se seguir aquele modelo de empacotamento (deploy), dá certo.

http://java.sun.com/j2ee/1.4/docs/tutorial/doc/Overview5.html

Dá uma lida sobre Classloader. Aqui no GUJ tem um artigo a respeito: http://www.guj.com.br/java.tutorial.artigo.124.1.guj

kleins

Entendi.

Li o artigo sobre classloader e foi muito esclarecedor.

O classloader vai no contexto da aplicação EJB e pega a classe “Cliente” pra usar no lado client da aplicação…

Acho então que o jar com as classes do EJB ficam na aplicação cliente só durante o desenvolvimento pra fins de integração com a IDE…

Vou fazer testes e mais testes…rs

Abraço e valeu !

felipeguerra

Daniel,

No JBoss 4.X eu não consigo injetar um EJB na minha servlet, ok?

danieldestro

É isso ai, kleins.

felipeguerra , o JBoss 4.2 já trabalha com EJB 3.0.

felipeguerra

danieldestro:

felipeguerra , o JBoss 4.2 já trabalha com EJB 3.0.

Preciso configurar algo no web.xml?

danieldestro

Você está usando o @EJB em qual classe?

felipeguerra

Para fins de estudo, estou usando a anotação @EJB numa Servlet que está dentro do meu .EAR!

Criado 22 de julho de 2008
Ultima resposta 25 de jul. de 2008
Respostas 16
Participantes 4