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 ?
è 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?
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.
MeuEJBejb=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…
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.