Há no vraptor3 como eu invocar métodos como no JPA usando listeners? Por exemplo, eu tenho um bean qualquer com escopo @ApplicationScoped. Então quero quando ele for inicializado chamar algum método, assim como quando ele for destruído. Porém esse meu bean não é persistente, ou seja, nem sequer passa pelo contexto JPA. Nesse caso o vraptor3 consegue invocar esses métodos nos eventos especificados?
@ApplicationScopedpublicfinalclassFoo{privateStringxpto;privatefinalEntityManagerFactoryfactory;publicFoo(finalEntityManagerFactoryfactory){this.factory=factory;}@PostConstructpublicvoideventInit(){xpto="Aha";System.out.println("hello");EntityManagerem=factory.createEntityManager();//faça o que quiser.em.close();}@PreDestroypublicvoideventDestroy(){System.out.println("goodbye");EntityManagerem=factory.createEntityManager();//faça o que quiser.em.close();}}
usei Dependencia do EntityManagerFactory, por se tratar de um escopo de aplicativo.... não da pra saber quando será rodado o construction ou destroy, e assim, vc pode usar um Entitymanager quando for criar ou destruir
G
garcia-jj
Lavieri, aí que está. Eu não possuo um entity manager, e nem quero ter. Eu estou em um contexto web-only, onde o JPA e controlado por um contexto EJB separado da aplicação web.
Talvez na pressa eu não expliquei direito. Mas eu tenho um bean qualquer bem simples, e quero apenas chamar alguns métodos no init e destroy do bean pelo vraptor, ou seja, chamar métodos quando o vraptor iniciar e matar meu bean. No caso do application-scoped não faz sentido, mas em um session-scoped faz sentido você chamar um método quando ele for removido da session.
Quanto ao init e destroy padrão do bean eu entendo que realmente nunca sabemos quando o destroy será chamado. Por isso pensei na annotation.
Abraços, e obrigado.
Lucas_Cavalcanti
Os listeners funcionam pra qualquer componente do VRaptor (classes anotadas com @Component)
Talvez não funcione para @SessionScoped no PicoContainer… pois o Pico não tem controle de escopo, é tudo feito pelo VRaptor… e é meio difícil saber quando a sessão foi terminada (ou invalidada) sem context listeners…
@RequestScoped e @ApplicationScoped funciona bem
[]'s
G
garcia-jj
Enfim, fiz os testes usando o Spring como provider e funcionou de maneira muito satisfatória.
Usei isso em uma classe pós JAAS authentication, onde essa classe pega os dados que vem do JAAS e deixa como session-scoped os dados como nome, ultimo login e tudo mais. Quando a http-session cai, o método anotado com @PreDestroy é invocado, avisando ao meu módulo EJB que o usuário foi desconectado.