CDI e o Struts 2? [Resolvido]

Olá pessoal.

Seguinte, tenho um projeto web onde eu faço uma requisição para uma action do Struts 2 e dentro da action eu faço lookup via JNDI para buscar um EJB 3.1 e invocar um método de negócio.

Até aí tudo certo. Dentro do EJB eu consigo usar Context and Depedency Injection tranquilamente, mas eu gostaria de saber se existe uma forma de usar o CDI dentro da minha action do struts 2. Creio que a melhor forma seria se a action fosse criada de forma a ela mesmo se tornar um “managed-bean”. Consigo fazer algo parecido com o Spring ou com o Guice apenas trocando a Object Factory do struts para usar esses frameworks, assim eu consigo ter uma action do struts 2 com todos os recursos do spring por exemplo.

Alguém sabe se existe uma forma prática de realizar isso com CDI? Basicamente eu precisava disso para injetar classes anotadas com @SessionScoped ou @ApplicationScoped

Para ativar CDI em uma aplicação web você precisa colocar um beans.xml (mesmo que vazio) no WEB-INF ou WEB-INF/classes

Sim, isso eu tenho.

Tipo, eu consigo usar CDI dentro dos meus EJBs que foram acessados via lookup jndi. Mas eu queria uma forma de por dentro da action do struts 2, que não é uma classe gerenciada pelo container poder usar a CDI. Basicamente seria uma forma de usar o CDI para criar minhas action, assim automaticamente eles já estariam prontas para receber injeção de dependecia.

Uma coisa que pensei foi em criar minha própria factory de objetos do struts 2 e dentro dela criar minhas actions, mas mesmo assim eu ainda precisaria de uma forma de acessar os objetos gerenciados pelo CDI por uma classe minha não gerenciada, que eu usaria como factory do struts 2.

Eu descobri também que usando:

 @Inject
 private Instance<Object> container;

dentro de um EJB ou outra classe qualquer gerenciada pelo container, eu consigo acessar o valor desse container. Creio que basicamente uma forma de criar esse “Instance<Object>” via programação/lookup resolveria meu problema.

Consegui resolver a questão. Olhando no svn do struts 2, vi que eles já tem um plugin para isso.

http://www.mail-archive.com/commits@struts.apache.org/msg07420.html

Que na verdade é apenas uma factory de objetos do struts, que cria as actions já sob o contexto gerenciado do CDI. Basicamente era o que eu estava querendo implementar na mão. Só precisei copiar essa classe aí do link para o meu projeto e no struts.xml colocar:

&lt;constant name="struts.objectFactory" value="meuPacoteOndeEstaAFactory.ClasseDaFactoryMostradaNoLinkAcima" /&gt;

Com isso, nas minhas actions posso usar desde um @Inject e até mesmo @EJB.