VRaptor: Problema de chamadas duplicadas na ComponentFactory

4 respostas
B

Pessoal, estou tendo um problema que não consigo identificar.
Tenho um ComponentFactory que cria a sessão com o banco de dados. Acontece que o método está sendo invocado duas vezes e não consigo resolver esse problema.
Portanto, peço a ajuda do pessoal do VRaptor.

Segue código da classe:

@Component
@RequestScoped
public class DbSessionCreator implements ComponentFactory<DbSession> {
    private DbSessionFactory dbSessionFactory;
    private DbSession dbSession;

    public DbSessionCreator(DbSessionFactory dbSessionFactory) {
        this.dbSessionFactory = dbSessionFactory;
    }

    @PostConstruct
    public void create() {
        // PROBLEMA!! Este método está sendo invocado duas vezes para cada requisição!!!
        this.dbSession = this.dbSessionFactory.getNewDBSession();
        Logger.getLogger(this.getClass()).info("Adicionando conexão do contexto!!");
    }

    public DbSession getInstance() {
	return this.dbSession;
    }

    @PreDestroy
    public void destroy() {
        // PROBLEMA!! Este método está sendo invocado duas vezes para cada requisição!!!
        Logger.getLogger(this.getClass()).info("Removendo conexão do contexto!!");
        this.dbSession.close();
    }

}

Log:

03:04:51,560 DEBUG [VRaptor ] VRaptor received a new request
03:04:51,560 DEBUG [PicoComponentRegistry] There's no @SessionScoped component, so skipping session container creation
03:04:51,585 DEBUG [PicoComponentAdapter] New adapter for br.com.bruno.business.vraptor.integration.DbSessionCreator
03:05:00,326 INFO [DbSessionCreator ] Adicionando conexão do contexto!!
03:05:00,661 INFO [DbSessionCreator ] Adicionando conexão do contexto!!

...

03:05:03,004 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
03:05:03,004 DEBUG [ForwardToDefaultViewInterceptor] Request already dispatched and commited somewhere else, not forwarding.
03:05:03,489 INFO [DbSessionCreator ] Removendo conexão do contexto!!
03:05:04,010 INFO [DbSessionCreator ] Removendo conexão do contexto!!
03:05:04,011 DEBUG [VRaptor ] VRaptor ended the request

4 Respostas

Lucas_Cavalcanti

é só esse log que está aparecendo duplicado?

tenta imprimir no log o this para saber se são duas instâncias diferentes da component-factory

B

Lucas,
Não é só o log que está duplicado. Eu rodei o tomcat em modo debug com breakpoint nestes métodos e eles executam duas vezes para cada request, portanto criando duas conexões por request.
Não estou com acesso ao código agora, mas quando puder, vou verificar se são duas instâncias diferentes.

B

Então,
O Vraptor está criando duas intâncias da ComponentFactory, como dá para ver pelo log:

22:05:51,903 DEBUG [VRaptor ] VRaptor received a new request
22:05:51,903 DEBUG [PicoComponentRegistry] There’s no @SessionScoped component, so skipping session container creation
22:05:51,910 DEBUG [PicoComponentAdapter] New adapter for br.com.bruno.business.vraptor.integration.DbSessionCreator
22:05:51,911 INFO [DbSessionCreator ] Adicionando conexão do contexto: br.com.bruno.business.vraptor.integration.DbSessionCreator@2b1682
22:05:51,911 INFO [DbSessionCreator ] Adicionando conexão do contexto: br.com.bruno.business.vraptor.integration.DbSessionCreator@7616ad

Sabem o motivo, ou como resolver este problema?

Lucas_Cavalcanti

deve ser pq o vraptor ta registrando o seu componente duas vezes, uma pra classe e uma para a interface ComponentFactory =(

um jeito de corrigir esse problema é criando um custom provider que estende o PicoProvider e registra o componente na mão (no método registerCustomComponents)

outro jeito é trocando o pico pelo guice ou spring

Criado 8 de setembro de 2011
Ultima resposta 8 de set. de 2011
Respostas 4
Participantes 2