[Vraptor] Dúvida com Interceptor

4 respostas
G

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

}
Dentro do interceptor eu faço auth.getPaciente(). Essa classe que faz o acesso ao banco:
@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);
	}

}
PacienteDao é a classe que trabalha com a session do hibernate:
@Component
public class PacienteDao extends ModelDao<Paciente> {

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

	...

}
A session é injetada através da seguinte factory:
@Component
public class HibernateSession implements ComponentFactory<Session> {

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

}

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

4 Respostas

Lucas_Cavalcanti

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

G

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?

Lucas_Cavalcanti

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.

G

Entendi.

Valeu pela ajuda.
Abraços.

Criado 18 de dezembro de 2013
Ultima resposta 18 de dez. de 2013
Respostas 4
Participantes 2