injetar ejb no war dentro do mesmo ear  XML
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Autor Mensagem
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

Bom dia pessoal...

estou estudando EJB por conta, com uns materiais que peguei na net... bom to tentando fazer o seguinte: tenho um ear, dentro dele um war e um jar de ejb, dentro do jar tenho dois session beans, um statefull e outro stateless, estou tentando injetar o statefull em um Filter que tenho la dentro do meu war, mas não estou conseguindo. Estou usando o JBoss 5.1 no eclipse. Será que alguém saberia o motivo de estar dando a exceção abaixo?

dentro do meu projeto ejb tenho isso:









dentro do mesmo enterprise aplication project (projeto que pega os outros e monta no ear) estão o ejb project que monta o jar com os arquivos acima e o meu web project, que monta o war, contendo o seguinte Filter:




La no eclipse eu configurei no build path do projeto web, adicionando o projeto do ejb, la no build path do projeto e no JEE module dependencies.

o JBoss ta falando que registrou os EJBs:

09:02:17,766 INFO [EJBContainer] STARTED EJB: ejb.sessionBeans.local.CarrinhoBean ejbName: CarrinhoBean
09:02:17,781 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

carrinhoCompras - EJB3.x Default Local Business Interface
CarrinhoEar/CarrinhoBean/local-ejb.interfaces.CarrinhoLocal - EJB3.x Local Business Interface

09:02:17,891 INFO [SessionSpecContainer] Starting jboss.j2ee:ear=CarrinhoEar.ear,jar=CarrinhoDeCompras.jar,name=FinalizarCompraBean,service=EJB3
09:02:17,891 INFO [EJBContainer] STARTED EJB: ejb.sessionBeans.local.FinalizarCompraBean ejbName: FinalizarCompraBean
09:02:17,906 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

finalizarCompra - EJB3.x Default Local Business Interface
CarrinhoEar/FinalizarCompraBean/local-ejb.interfaces.FinalizarCompraLocal - EJB3.x Local Business Interface

09:02:19,984 INFO [TomcatDeployment] deploy, ctxPath=/AppComCarrinho



esse é o stack trace ao iniciar o JBOSS:



iniciando o servidor em modo debug, botei um break point no construtor do filter onde tento obter o objeto da interface do meu EJB, ao tentar fazer isso ele entra na classe InvocationTargetException.

Grato pela ajuda.





espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
breno500as
Virtual Machine Man
[Avatar]
Membro desde: 11/10/2007 17:53:07
Mensagens: 614
Localização: Belo Horizonte - MG
Offline

Tem como você postar seu web.xml ?

Sun Certified Java Programmer 5.0
Sun Certified Web Component Developer 5.0
Sun Certified Business Component Developer 5.0
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

desculpa pela demora... foi meio corrido aqui no serviço...

bem, estou seguindo um pdf aqui que não diz nada sobre esse arquivo, portanto deixei do jeito que a IDE gerou para mim.



esse é o web.xml do meu projeto web, aliais o unico que encontrei aqui no eclipse.

obrigado pela ajuda.

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
garcia-jj
JWizard

Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline

Você só consegue injetar Stateless Session Beans em filters e listeners. Statefull não dá, já que filter e servlets não são thread-safe.
breno500as
Virtual Machine Man
[Avatar]
Membro desde: 11/10/2007 17:53:07
Mensagens: 614
Localização: Belo Horizonte - MG
Offline

garcia-jj wrote:Você só consegue injetar Stateless Session Beans em filters e listeners. Statefull não dá, já que filter e servlets não são thread-safe.


Não sabia que existia essa restrição... Irira sugerir a ele utilizar DI + web.xml , mas provavelmente iria dar o mesmo erro..

This message was edited 1 time. Last update was at 01/04/2010 17:43:48


Sun Certified Java Programmer 5.0
Sun Certified Web Component Developer 5.0
Sun Certified Business Component Developer 5.0
garcia-jj
JWizard

Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline

breno500as wrote:
garcia-jj wrote:Você só consegue injetar Stateless Session Beans em filters e listeners. Statefull não dá, já que filter e servlets não são thread-safe.


Não sabia que existia essa restrição... Irira sugerir a ele utilizar DI + web.xml , mas provavelmente iria dar o mesmo erro..


Note bem que essa restrição é bem obvio. Afinal stateful mantém estado, porém como você quer manter estado em uma instância compartilhada entre threads.

Quanto a usar um Stateful em um serlvet ou filter, você pode fazer um lookup manual via JNDI, porém use isso apenas dentro do método e nunca deixe a instância na classe, pois assim você irá deixar uma única instância para todo mundo e também o EJB nunca irá ser "passivado".

This message was edited 1 time. Last update was at 01/04/2010 20:13:26


http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum.
breno500as
Virtual Machine Man
[Avatar]
Membro desde: 11/10/2007 17:53:07
Mensagens: 614
Localização: Belo Horizonte - MG
Offline

garcia-jj wrote:Afinal stateless mantém estado, ....


Na verdade você quis dizer statefull...

garcia-jj wrote:Quanto a usar um Stateful em um serlvet ou filter, você pode fazer um lookup manual via JNDI, porém use isso apenas dentro do método e nunca deixe a instância na classe, pois assim você irá deixar uma única instância para todo mundo e também o EJB nunca irá ser "passivado".


Concordo, além de ser inseguro e ter o ciclo de vida gerenciado pelo cliente ele nunca será passivado....


Sun Certified Java Programmer 5.0
Sun Certified Web Component Developer 5.0
Sun Certified Business Component Developer 5.0
garcia-jj
JWizard

Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline

breno500as wrote:
garcia-jj wrote:Afinal stateless mantém estado, ....
Na verdade você quis dizer statefull...

hehe, é mesmo. Já fiz a correção.

http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum.
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

intendi... e se eu deixasse essa instancia do session bean na sessão do usuario, depois pegasse na sessão? rolaria?

eu cabei de chegar na empresa e vi as respostas (agradeço por todas) só agora, ainda não testei, vou fazer o teste, deixar um getter pro innitialContext e caso o atributo não exista na sessão ele usa o getter.

obrigado a todos, depois volto aqui para dizer se deu certo...

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

pessoal, mudei o meu CarrinhoBean para stateless, porém continua dando o mesmo erro...


iniciando o JBOSS em modo debug botei um ponto para parar na parte onde tenta obter a referencia ao EJB, e percebi que o meu objeto SessionContext (com a anotação @Resource) está nulo... eu estou fazendo alguma coisa errada?

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
breno500as
Virtual Machine Man
[Avatar]
Membro desde: 11/10/2007 17:53:07
Mensagens: 614
Localização: Belo Horizonte - MG
Offline

maior_abandonado wrote:....eu estou fazendo alguma coisa errada?


Está...

maior_abandonado wrote:....SessionContext (com a anotação @Resource) está nulo


@Resource é para ser usado em um componente de negócio, não em um componente web..... Se quiser trabalhar com lookup obtenha uma conexão com a JNDI ( InitialContext ) e através dela faça o seu lookup...

Testa aí...

Sun Certified Java Programmer 5.0
Sun Certified Web Component Developer 5.0
Sun Certified Business Component Developer 5.0
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

breno500as wrote:
maior_abandonado wrote:....eu estou fazendo alguma coisa errada?


Está...

maior_abandonado wrote:....SessionContext (com a anotação @Resource) está nulo


@Resource é para ser usado em um componente de negócio, não em um componente web..... Se quiser trabalhar com lookup obtenha uma conexão com a JNDI ( InitialContext ) e através dela faça o seu lookup...

Testa aí...


quer dizer que eu não posso injetar um EJB stateless numa servlet também?

eu alterei a servlet e criei uma classe para popular o carrinho e retornar o objeto para a servlet, ficou desse jeito:



e a minha servlet mudei para isso:



o erro persiste aquele mesmo, mais alguma sugestão?

a claro, obrigado pelo help.

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
breno500as
Virtual Machine Man
[Avatar]
Membro desde: 11/10/2007 17:53:07
Mensagens: 614
Localização: Belo Horizonte - MG
Offline

maior_abandonado wrote: quer dizer que eu não posso injetar um EJB stateless numa servlet também?


Não, você pode sim....




Achei seu código um pouco estranho, não é legal instanciar objetos no "braço" quando se trabalha com componentes de negócio...



Persiste pois sua classe TesteBO é uma classe java comum, o container não irá injetar dependências nela, a não ser que você a marque como um componente de negócio(stateless,statefull...), e o container tbm não irá injetar depedencias em componentes WEB, ele pode no máximo injetar um EJB na sua variável, você apenas trocou seu problema de lugar, de um componente WEB para uma classe java comum...

Se quiser trabalhar com o lookup tente fazer da forma que te falei, procure pelo InitialContext() ...

Abraços..


Sun Certified Java Programmer 5.0
Sun Certified Web Component Developer 5.0
Sun Certified Business Component Developer 5.0
garcia-jj
JWizard

Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline

maior_abandonado wrote:quer dizer que eu não posso injetar um EJB stateless numa servlet também?


Você PODE injetar stateless, mas NAO pode injetar stateful.

http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum.
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

breno500as wrote:
maior_abandonado wrote: quer dizer que eu não posso injetar um EJB stateless numa servlet também?


Não, você pode sim....




Achei seu código um pouco estranho, não é legal instanciar objetos no "braço" quando se trabalha com componentes de negócio...



Persiste pois sua classe TesteBO é uma classe java comum, o container não irá injetar dependências nela, a não ser que você a marque como um componente de negócio(stateless,statefull...), e o container tbm não irá injetar depedencias em componentes WEB, ele pode no máximo injetar um EJB na sua variável, você apenas trocou seu problema de lugar, de um componente WEB para uma classe java comum...

Se quiser trabalhar com o lookup tente fazer da forma que te falei, procure pelo InitialContext() ...

Abraços..



então cara... tentei injetar o EJB na variavel, deixei assim:



a variavel estava nula, foi repassada para o servlet ainda estava nula, por isso não melhorei muito ainda...

eu procurei marcar a classe com um @Stateless, conforme você disse, mas não mudou muit coisa, tentei destes 2 jeitos:



e



onde o meu SessionContext esta nulo...

eu não quero trabalhar com InnitialContext, preencher o properties na mão, com informações que dependem de container para container...etc, eu to tentando fazer com que o container monte o objeto para mim, ou o sessionContext, ou o EJB em si... não to conseguindo, mesmo só tendo um session bean implementando a interface em questão...

alguma dica?

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
 
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Ir para:   
Powered by JForum 2.1.8 © JForum Team