[VRaptor] @PostConstruct e @PreDestroy [RESOLVIDO]

2 respostas
andretdes

Galera estou tendo um problema quanto as annotations @PostConstruct e @PreDestroy fiz de acordo com o forum caelum e conforme diversas outras fontes mas nada, estou tentando implementar em um projeto a parte quanto a controle de sessão no DB2 conforme código abaixo:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;

@Component
public class HibernateUtil implements ComponentFactory<Session> {

	private static SessionFactory sessionFactoryDb2;
	private static Configuration confDb2 = new Configuration();
	private Session session;

	static {
		sessionFactoryDb2 = confDb2.configure().buildSessionFactory();
	}

	private HibernateUtil() {
	}

	/**
	 * ThreadLocal que controla a sessão.
	 */
	public static final ThreadLocal<Session> threadSession = new ThreadLocal<Session>();

	@Override
	public Session getInstance() {
		return threadSession.get();
	}

	@PostConstruct
	public void create() {
		this.session = sessionFactoryDb2.openSession();
		threadSession.set(session);
	}

	@PreDestroy
	public void destroy() {
		threadSession.get().close();
		if (session != null)
			session.close();
	}
}

O problema é que a o objeto session sempre vem nulo, isso ocorre porque por algum motivo as annotations acima não estão sendo chamadas como deveria e a session não está sendo aberta. Em um projeto separado (Maven project) apenas com Spring e uma simples injeção ele ao dar um load() no .xml do Spring ele já chama sem problemas essas annotations...

Via Provider até conseguimos fazer funcionar como deveria mas o problema é que temos vários projetos seprados e essa parte está em um projeto em comum com todos os outros ou seja ele não é um webProject logo não tenho um web.xml para registrar o meu provider, consequencia disso não consigo rodar os meus JUnits e estou tendo problemas nas ferramentas de monitoração que usamos aqui (Hudson e Sonar)...

Alguém sabe como resolvo esse problema ?

abs e obrigado.

2 Respostas

Lucas_Cavalcanti

não coloque a sessão na threadLocal!! retorne a session que está no atributo da classe.

receba as Sessions nos construtores das classes e deixe o vraptor injetá-las pra vc.

daí vc não vai ter esse problema do null.

Mesmo que essas classes estejam fora do projeto web, nada impede de vc receber a session no construtor e fazer o código do jeito certo, sem roubar usando thread locals.

andretdes

Legal Lucas funcionou… Vlw

Criado 17 de julho de 2012
Ultima resposta 31 de jul. de 2012
Respostas 2
Participantes 2