@Autowired em actions do struts 2

Na minha aplicação o @Autowired funciona perfeitamente se estiver dentro do um bean do spring, porém em actions do struts não está funcionando.

Estou usando isso como um workaround:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); this.userManager = (UserManagerSpring) context.getBean("userManagerSpringBean");
mas acho muito feio, alguém sbe me dizer o que preciso fazer pro @Autowired funcionar nas actions?

Essa anotação @Autowired não é apenas para o Spring?

sim…

quero chamar o meu bean do spring dentro da minha action

Qual é o erro que aparece pra você? Joga o trace aqui.

Flw! :thumbup:

Dá um nullpointer quando eu tento chamar o método da session.

Da máquina em que eu estou agora não tenho acesso a aplicação, mais tarde eu volto e coloco a stack, mas já li ela toda e fora o nullpointer não tem mais nada indicando que ele não conseguiu fazer o autoowiring nem nada do tipo.

É necessária alguma configuração no web.xml ou no struts.xml para que isso funcione? Ou deveria funcionar sozinho?

Não tive a oportunidade ainda de fazer teste de Struts 2 e Spring 2.5+ … já tentou o @Qualifier(“beanName”) ?

@Qualifier("userManagerSpringBean")
private UserManager userManager;

[]'s

Não conhecia esse jeito… vou até tentar, mas veja que dessa forma eu também tenho que passar o nome da implementação que quero usar, considero isso ruim. O ideal seria eu poder usar o @Autowired mesmo.

Sim, você está certo. Você está usando a configuração de xml ou ta deixando ele scannear um pacote inteiro base ?

Está escanneando um pacote inteiro, nessa pacote tem as interfaces e as implementações das sessions

As actions estão em outro pacote

Andei pensando, faz sentido o @Autowired não funcionar, pois quem está gerenciando e instanciando as actions é o Struts … Como eu nunca fiz essa dupla funcionar juntas, vou ficar te devendo ajuda, como ultima deixa, tente ver este ultimo link: http://struts.apache.org/2.0.14/docs/spring-plugin.html

[]'s

Estou escrevendo um post explicando como fazer essa integração de forma bem simples, usando anotações e sem xml. Assim que estiver pronto (acho que termino até amanhã) posto aqui.

Flw!

Demorei um dia a mais do que o prometido, mas aí está :

http://www.simpledev.com.br/struts2-spring.html

Nesse post eu mostro uma forma fácil de integrar o Struts 2 e o Spring, nele viso a simplicidade e faço bem pouca configuração, espero que ajude!

Flw! :thumbup:

Cara, mto obrigado pelo trabalho de criar o tutorial!
Mas infelzimente não funcionou pra mim :frowning:

Tem uma diferença entre o meu projeto e esse q vc descreveu no seu tutorial:
Vc coloca o seu @Autowired no seu DAO e eu quero colocar meu @Autowired na minha Action do struts 2, ou seja, minha action teria um bean do spring injetado para que ela possa chamar métodos que persistem coisas no BD.

Talvez seja esse o problema… eu segui a configuração do tutorial, na verdade tudo já estava igual à minha, com exceção do trecho:

<struts> <constant name="struts.objectFactory" value="spring" /> </struts>

achei que isso resolveria pro meu caso vendo a sua explicação de que isso mostraria para o struts que o spring deveria fazer a instanciação dos objetos, mas infelizmente não deu certo.

Acho que você se confundiu amigo, eu uso o @Autowired para injetar o Dao na Action através do construtor, ele está na Action, dessa forma que vocês está falando. Assim, na Action posso usar o Dao que foi injeto tranquilamente.

Blz? Flw! :thumbup:

Certo… bom, eu nunca usei o @Autowired dessa forma, assim que chegar em casa vou fazer umas experiências então e ver se consigo fazer isso funcionar.
Estou acostumado a usar assim:

public void MinhaAction extends ActionSupport { @Autowired private MeuBeanSpring meuBean; //... }

Mas nos sistemas em que eu mexi a configuração do spring e struts já estavam prontas, eu só fiz alterações mas nunca havia criado do zero.

Um outro detalhe é que eu uso o hibernate pra persistência, então não uso DAOs.

Repare que eu até falei no post que o Spring pode fazer a injeção de 3 formas, pelo construtor, por um método set e diretamente, como você mostrou. Mas fazendo dessa forma, quando você for fazer um teste unitário, como você faz pra fornecer a dependência? Não há como fazê-lo, por isso desaconselho usar dessa forma.

E sobre o Dao, se você não o usa, creio que você faz uso da Session direto na action, correto? Será que é uma boa abordagem, cada vez que for necessária uma alteração em uma busca ter de recompilar essa Action, que não tem nada a ver com a alteração? Pense à respeito, ele não é um padrão tão utilizado à toa.

Blz? Flw! :thumbup: