Como fazer isso usando EJB

Salve salve galera!!!

Estou com um problema de pensamento :roll: onde dividir umas classes com ejb.

Por exemplo eu faço um método que retorna uma List no ejb.

Na minha aplicação cliente eu tenho que acessar esse método remotamente num outro servidor, e logicamente preciso da classe Usuario também na minha app web.

Agora vou ter a classe Usuario lá no pacote de negócio junto ao ejbs, ou fica no lado app cliente?

pq vou precisar dela em ambos locais, como resolver?

pq senão fica duplicado, ai eh maus!!!

valeu galera!!!

Você tem q declarar uma interface remota… Se tiver usando EJB3 Coloque a annotation @Remote em uma interface desse ejb. Se tiver usando o ejb2.1 vc tem q configurar no xml do ejb.

Para acessar esse ejb remotamente vc pode usar o Naming.lookup(“url (cominho do seu ejb)”). Esse metodo vai lhe o acesso ao ejb remoto.

[quote=leo_mf]Você tem q declarar uma interface remota… Se tiver usando EJB3 Coloque a annotation @Remote em uma interface desse ejb. Se tiver usando o ejb2.1 vc tem q configurar no xml do ejb.

Para acessar esse ejb remotamente vc pode usar o Naming.lookup(“url (cominho do seu ejb)”). Esse metodo vai lhe o acesso ao ejb remoto.[/quote]

colega acho q vc não me entendeu…

eu tenho minha interface remota.
tenho um método que retorna uma lista de Usuário (Modelo), na interface remota tenho que dar import na classe Usuário, senão ela nem compila, certo!

no meu controle onde fiz um lookup no ejb remoto vou receber uma lista de Usuários, novamente tenho que dar import na classe Usuario senão da erro de compilador certo!

ou seja, preciso dar import em dois locais, no ejb remoto, e minha app cliente, ONDE minha classe Usuario deveria ficar? qual pacote? tenho que replicar ela em dois locais?

Você pode criar um módulo a parte (Utility Jar) e referenciar ele em ambos os módulos (EJB e WEB).
Eu geralmente faço isso com os objetos do JPA, crio um módulo a parte só para trabalhar com JPA

[quote=Jair Rillo Junior]Você pode criar um módulo a parte (Utility Jar) e referenciar ele em ambos os módulos (EJB e WEB).
Eu geralmente faço isso com os objetos do JPA, crio um módulo a parte só para trabalhar com JPA[/quote]

perfeito!!!

não tinha pensado em jar, somente em duplicar, mas é isso mesmo valeu muito pela idéia, vou fazer assim!!!

Jair e quanto as interfaces remotas do ejb que preciso conhecer, pra eu fazer um Cast tmb tenho que importá-las, neste caso faço o mesmo esquema, faço um jar só com as interfaces remotas?

Dê uma pesquisada sobre “Application client module”. Basicamente esse módulo irá conter só as interfaces dos EJBs. Portanto ambos os módulos EJB e o Web podem usá-lo.
O Eclipse com WTP cria esses módulos e fazem a separação para você.

[quote=Jair Rillo Junior][quote=JavaTux]
Jair e quanto as interfaces remotas do ejb que preciso conhecer, pra eu fazer um Cast tmb tenho que importá-las, neste caso faço o mesmo esquema, faço um jar só com as interfaces remotas?
[/quote]

Dê uma pesquisada sobre “Application client module”. Basicamente esse módulo irá conter só as interfaces dos EJBs. Portanto ambos os módulos EJB e o Web podem usá-lo.
O Eclipse com WTP cria esses módulos e fazem a separação para você.[/quote]

valeu Jair, me esclareceu e ajudou muito mesmo!!!

Jair te incomodando mais um pouco, como você utiliza na comunicação remota?

estou pensando em usar um Business Delegate e um Session Facade… pra isolar a complexidade… o q acha?

Depende…

Não existe o jeito certo de fazer tudo, isso varia muito com os requisitos. Mas a idéia básica é: tente deixar o mais simples possível. Use várias camadas se realmente for necessário.

Pelo que eu entendi, você tem o seguinte requisito:
O Cliente requisita uma lista de usuários, e um session bean retorna essa lista, certo?
Você está usando EJB2 ou EJB3? Se for o 3 e usando o exemplo acima, eu não usuaria nem o Delegate e nem o Facade. Colocaria o cliente para acessar o SessionBean direto (Usando o @EJB) e assim evitando acoplamento. Caso seja EJB2, o Business Delegate ficaria legal, agora o Facade não tem motivo (já que é uma operação bem simples).

Resumindo. depende muito do requisito, mas sempre tente deixar as coisas o mais simples possível (e evitando acoplamento).

entendo sua colocação…
estou com EJB 3…

no meu caso uso struts 2, neste caso que vc citou usar o @EJB, no caso dentro da minha action do struts eu usaria este annotation pra o Session Bean… porém eu não poderia fazer isso na action já que ela não é gerenciada certo? neste caso eu teria que fazer um lookup correto?

ou eu ainda tenho como usar o @EJB num action do struts 2?

[quote=JavaTux]entendo sua colocação…
estou com EJB 3…

no meu caso uso struts 2, neste caso que vc citou usar o @EJB, no caso dentro da minha action do struts eu usaria este annotation pra o Session Bean… porém eu não poderia fazer isso na action já que ela não é gerenciada certo? neste caso eu teria que fazer um lookup correto?

ou eu ainda tenho como usar o @EJB num action do struts 2?[/quote]

Realmente, você não pode usar a anotação @EJB, porém existe um plugin do Struts 2 que simula do @EJB, assim evitando o acoplamento. http://cwiki.apache.org/S2PLUGINS/ejb3-plugin.html. Na verdade o componente não fica gerenciado, pois esse plugin faz um lookup no interceptor, mas o legal que ao invés de você criar uma camada a mais (Business Delegate), você pode usar o plugin pra fazer isso para você.

Eu utilizei esse plugin (na verdade eu precisei editar o código fonte dele) para funcionar no Websphere 6.1 e até hoje está funcionamento muito bem. Na aplicação que eu estou trabalhando (com Struts 2 + EJB3 + Websphere 6.1) não estamos utilizando o padrão Business delegate, e o facade está sendo utilizado em mínimos casos.

valeu Jair, vou olhar o plugin, de fato ele vai de fato economizar uma camada.