[Vraptor] Dúvida com Interceptor

Olá,

Eu tenho um interceptor que é responsável por verificar o usuário logado no acesso de páginas restritas do meu sistema. Esse interceptor precisa buscar um registro do banco de dados. Porém, quando ele tenta acessar, diz que a session do hibernate está fechada.

Interceptor:

[code]@Intercepts
public class AuthInterceptor implements Interceptor {

private final Result result;
private final Auth auth;

public AuthInterceptor(Result result, Auth auth) {
	this.result = result;
	this.auth = auth;
}

public boolean accepts(ResourceMethod method) {
	return this.auth.isLogado() || method.containsAnnotation(Restrito.class);
}

public void intercept(InterceptorStack stack, ResourceMethod method,
		Object instance) throws InterceptionException {
	if (auth.isLogado()) {
		result.include("logado", auth.getPaciente());
		stack.next(method, instance);
	} else if (method.containsAnnotation(Restrito.class)) {
		result.redirectTo(PagesController.class).index(true);
	}
}

}[/code]

Dentro do interceptor eu faço auth.getPaciente(). Essa classe que faz o acesso ao banco:

[code]@Component
@SessionScoped
public class Auth {

private String pacienteCPF;
private PacienteDao pacienteDao;

public Auth(PacienteDao pacienteDao) {
	this.pacienteDao = pacienteDao;
}

...

public Paciente getPaciente() {
	return pacienteDao.visualizar("cpf", pacienteCPF);
}

}[/code]

PacienteDao é a classe que trabalha com a session do hibernate:

[code]@Component
public class PacienteDao extends ModelDao {

public PacienteDao(Session session) {
	super(session, Paciente.class);
}

...

}[/code]

A session é injetada através da seguinte factory:

[code]@Component
public class HibernateSession implements ComponentFactory {

private SessionFactory factory;
private Session session;

public HibernateSession(SessionFactory factory) {
	this.factory = factory;
}

@PostConstruct
public void construtor() {
	this.session = factory.openSession();
}

public Session getInstance() {
	return this.session;
}

@PreDestroy
public void destrutor() {
	this.session.close();
}

}[/code]

Porque a session fica fechada durante a execução do interceptor?

vc tá recebendo o PacienteDao, que é request scoped, dentro do Auth, que é session scoped…

ou seja, depois do primeiro request, o dao é fechado.

vc precisa remover essa dependência, ela é realmente necessária?

se sim, tenta receber um Provider e dar um provider.get() pra pegar o dao a cada vez que vc precisar usá-lo

Entendi… Posso tentar fazer de outra forma sim.

Mas só uma curiosidade: o que o Provider faz exatamente? Ele “pega” a instância da do request ou ele cria uma outra instância de PacienteDao? E porque evitar o uso dele?

o Provider ele pega a instância ativa do escopo. Isso se vc estiver usando o Guice como DI container.

O que é preciso evitar é usar componentes de escopo curto dentro de componentes de escopo longo.

Entendi.

Valeu pela ajuda.
Abraços.