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.