Abrir sessao hibernate no filtro

Galera,

To fazendo um projeto e resolvi assumir a abordagem de abrir uma sessao no ServletFilter, deixa-la disponivel durante toda requisição e fecha-la depois. To fazendo isso com threadlocal seguindo aquele exemplo do Mauricio Linhares aqui no guj. Mas mesmo assim quando eu chamo os atributos que sao colecoes dentro da minha classe ele fica da aquela excessao no session … Pq?

Alberto

Sem mais dados fica difícil…
Mostre a msg de erro, stack trace, trecho de código etc.

Aqui esta a pilha de erro:

 HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: failed to lazily initialize a collection (scc.model.interfaces.impl.UsuarioImpl.contas) - no session or session was closed
	scc.web.ConnectionManagerFilter.doFilter(ConnectionManagerFilter.java:58)


root cause 

javax.servlet.ServletException: failed to lazily initialize a collection (scc.model.interfaces.impl.UsuarioImpl.contas) - no session or session was closed
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:74)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	scc.web.ConnectionManagerFilter.doFilter(ConnectionManagerFilter.java:48)


root cause 

org.hibernate.LazyInitializationException: failed to lazily initialize a collection (scc.model.interfaces.impl.UsuarioImpl.contas) - no session or session was closed
	org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:180)
	org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:48)
	org.hibernate.collection.PersistentSet.toArray(PersistentSet.java:142)
	java.util.ArrayList.addAll(ArrayList.java:473)
	scc.web.vraptor.logic.OperacaoUsuarioLogic.listarContas(OperacaoUsuarioLogic.java:37)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:585)
	org.vraptor.reflection.ReflectionUtil.invoke(ReflectionUtil.java:65)
	org.vraptor.reflection.JavaMethod.invoke(JavaMethod.java:31)
	org.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:73)
	org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:49)
	org.vraptor.core.BasicLogicFlow.execute(BasicLogicFlow.java:98)
	org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:89)
	org.vraptor.core.BasicLogicFlow.execute(BasicLogicFlow.java:98)
	org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:49)
	org.vraptor.core.BasicLogicFlow.execute(BasicLogicFlow.java:98)
	org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:33)
	org.vraptor.core.BasicLogicFlow.execute(BasicLogicFlow.java:98)
	org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:70)
	org.vraptor.core.VRaptorController.execute(VRaptorController.java:74)
	org.vraptor.VRaptorServlet.service(VRaptorServlet.java:51)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	scc.web.ConnectionManagerFilter.doFilter(ConnectionManagerFilter.java:48)


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.9 logs.


--------------------------------------------------------------------------------

Apache Tomcat/5.5.9

Servlet Filter:

package scc.web;

import helpframework.persistencia.util.HibernateUtil;
import helpframework.util.HelpUtil;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ConnectionManagerFilter implements Filter {

	private boolean eTransacional;
	private Log log = LogFactory.getLog(ConnectionManagerFilter.class);
	public ConnectionManagerFilter() {
		super();
		// TODO Auto-generated constructor stub
	}

	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
        String arg0 = config.getInitParameter("transacional");
        if(!HelpUtil.isPropriedadeVazia(arg0)){
        	eTransacional = Boolean.parseBoolean(arg0);
        }
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
        String url = ((HttpServletRequest)arg0).getRequestURI();
		HibernateUtil.getSession();
		log.debug("Conexao aberta com sucesso para url "+url);
		try{
		if(eTransacional){
			HibernateUtil.beginTransaction();
			log.debug("Iniciando transancao para a url "+url);
		}			
		
		arg2.doFilter(arg0,arg1);
		
		if(eTransacional){
			HibernateUtil.commitTransaction();
			log.debug("Fechando transacao para url "+url);
		}		
		
		}
		catch(Exception exception){
			log.error(exception);
			throw new ServletException(exception);
		}
		
		finally{
			HibernateUtil.closeSession();
			log.debug("Conexao fechada com sucesso para url "+url);
		}

		
		

	}

	public void destroy() {
		// TODO Auto-generated method stub

	}

}

Alberto

Cara, você tá rodando a aplicação em qual servidor?

O JBoss mata a conxão quando vc usa threadlocal, ele vê que vc não tá usando a conexão e mata ela, aí quando vc tenta usar outra vez, cabrum, dá a aexception.

Tive ess problema numa aplicação que eu fiz, e tive que mudar umas configurações no JBoss pra ele não fazer mais isso, só que tive que ter muito cuidado pra não largar nada aberto com o banco sem necessidade.

To usando o TOMCAT 5.5

Alberto