vraptor3: Posso usar event listeners? [resolvido]

4 respostas
G

Boa tarde,

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?

@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");
    }

}

4 Respostas

Lavieri
@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();
    }

}

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

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

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.

:thumbup:

Criado 15 de outubro de 2009
Ultima resposta 22 de out. de 2009
Respostas 4
Participantes 3