Bom dia galera.
Estou com uma dúvida na parte de injeção de dependências do VRaptor3 que surgiu devido a um problema que estou enfrentando.
Iniciei um projeto e estou utilizando o JPA para persistência, criei um EntityManagerProvider para poder fazer uso do EntityManagerCreator e o EntityManagerFactoryCreator fornecidos pelo próprio VRaptor.
Criei meu DaoFactory que recebe o EntityManager no construtor, que é injetado normalmente pelo VRaptor.
public class DaoFactory {
private EntityManager em;
public DaoFactory(EntityManager em) {
this.em = em;
}
//métodos omitidos
}
A partir do DaoFactory eu crios os daos
public ColaboradorDao getColaboradorDao() {
return new ColaboradorDao(em);
}
O meu problema é o seguinte, eu criei uma implementação minha do DaoFactoryInterceptor que não abre a transação, optei por abri-la pela factory apenas nos métodos que realmente precisam de uma trasação, assim não abro uma transação apenas em métodos que só fazem consulta.
Acontece que ao fazer um teste se o meu rollBack estava funcionando, criei um método que simularia uma inclusão no meu ColaboradorController:
public void adicionar(Colaborador colaborador) {
factory.beginTransaction();
factory.getColaboradorDao().adicionar(colaborador);
}
Deixei sem o commit propositadamente para simular uma possível exception onde o rollBack deveria ser executado.
Mas ao retornar para o interceptor, a factory ve que existe uma transação aberta, executa o rollBack mas mesmo assim o objeto é persistido no banco.
Será que como eu recebo o EntityManager no construtor do ColaboradorDao ao instancia-lo está sendo injetado um EntityManager diferente do que foi injetado no DaoFactory ao invéz de usar o que eu passei como parâmetro?
Acredito que não seja isso porque o EntityManager é RequestEscoped correto?
Alguma luz do que pode estar acontecendo?
Obrigado
[]'s
