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?
[code]@ApplicationScoped
public final class Foo {
private String xpto;
@PostConstruct
public void eventInit() {
xpto = "Aha";
System.out.println("hello");
}
@PreDestroy
public void eventDestroy() {
System.out.println("goodbye");
}
[code]@ApplicationScoped
public final class Foo {
private String xpto;
private final EntityManagerFactory factory;
public Foo(final EntityManagerFactory factory) {
this.factory = factory;
}
@PostConstruct
public void eventInit() {
xpto = "Aha";
System.out.println("hello");
EntityManager em = factory.createEntityManager();
//faça o que quiser.
em.close();
}
@PreDestroy
public void eventDestroy() {
System.out.println("goodbye");
EntityManager em = factory.createEntityManager();
//faça o que quiser.
em.close();
}
}[/code]
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
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.
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…
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.