VRaptor, problemas após o Capítulo 8 - Refatorando os DAOs.. [Resolvido]

Pessoal, boa tarde!

Estou seguindo a apostila fj-28 para desenvolver um projeto e após passar pelo capitulo 8 comecei a ter o problema a seguir:

GRAVE: Servlet.service() for servlet [default] in context with path [/muffato] threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.SessionException: Session is closed!
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: org.hibernate.SessionException: Session is closed!
	at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
	at org.hibernate.impl.SessionImpl.createCriteria(SessionImpl.java:1536)
	at br.com.disoft.dao.UsuarioDAO.localizaTodos(UsuarioDAO.java:42)
	at br.com.disoft.controller.UsuarioController.lista(UsuarioController.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 40 more

Minha classe DAO:

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.disoft.usuario.Usuario;

@SessionScoped
@Component
public class UsuarioDAO {

	private final Session session;

	public UsuarioDAO(Session session) {
		this.session = session;
	}

	public void adiciona(final Usuario usuario) {
		Transaction transaction = session.beginTransaction();
		usuario.setAtivo(true);
		session.save(usuario);
		transaction.commit();
	}

	public Usuario carrega(Integer id) {
		return (Usuario) this.session.load(Usuario.class, id);
	}

	public void atualiza(Usuario usuario) {
		Transaction tx = session.beginTransaction();
		this.session.update(usuario);
		tx.commit();
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> localizaTodos() {
		Criteria criteria = session.createCriteria(Usuario.class);
		return criteria.list();
	}
}

Criador de Session:

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

import org.hibernate.Session;
import org.hibernate.SessionFactory;

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

@Component
public class CriadorDeSession implements ComponentFactory<Session> {

	private final SessionFactory factory;
	private Session session;

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

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

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

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

}

Criador de Session Factory:

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

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

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

@Component
@ApplicationScoped
public class CriadorDeSessionFactory implements ComponentFactory<SessionFactory> {

	private SessionFactory factory;

	@PostConstruct
	public void abre() {
		AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.configure();
		this.factory = configuration.buildSessionFactory();
	}

	public SessionFactory getInstance() {
		return this.factory;
	}

	@PreDestroy
	public void fecha() {
		this.factory.close();
	}

}

Controller:

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.disoft.dao.UsuarioDAO;
import br.com.disoft.usuario.Usuario;

@Resource
public class UsuarioController {

	private UsuarioDAO dao;
	private Result result;

	public UsuarioController(Result result, UsuarioDAO dao) {
		this.dao = dao;
		this.result = result;
	}

	public String boasVindas() {
		return "olá mundo!";
	}

	public void formulario() {
	}

	public void adiciona(Usuario usuario) {
		dao.adiciona(usuario);
		result.redirectTo(this).lista();
	}

	@Path("/usuario")
	@Get
	public void lista() {
		result.include("usuarios", dao.localizaTodos());
	}

	public Usuario edita(Integer id) {
		return dao.carrega(id);
	}

	public void altera(Usuario usuario) {
		dao.atualiza(usuario);
		result.redirectTo(this).lista();
	}

	public void desativa(Integer id) {
		Usuario usuario = dao.carrega(id);
		usuario.setAtivo(false);
		altera(usuario);
	}
}

Já revisei a apostila desde o capitulo 5 duas vezes e não achei o que pode estar errado, alguém tem alguma sugestão???

Muito obrigado.

Só para constar os jars da minha aplicação são:

antlr-2.7.6
aopalliance
aspectjrt
cglib-nodep-2.1_3
commons-collections-3.2.1
commons-logging
dom4j-1.6.1
ejb3-persistence-1.0.1.GA
guava-r07
hibernate-3.3.2
hibernate-annotations-3.4.0
hibernate-commons-annotations-3.4.0
hibernate-entitymanager-3.4.0.GA
javassist-3.14.0.GA
jstl-api-1.2
jstl-impl-1.2
jta-1.1
log4j-1.2.16
mirror-1.5.1
objenesis-1.1
ognl-2.7.3
org.springframework.aop-3.0.5.RELEASE
org.springframework.asm-3.0.5.RELEASE
org.springframework.aspects-3.0.5.RELEASE
org.springframework.beans-3.0.5.RELEASE
org.springframework.context-3.0.5.RELEASE
org.springframework.core-3.0.5.RELEASE
org.springframework.expression-3.0.5.RELEASE
org.springframework.web-3.0.5.RELEASE
paranamer-2.2
postgresql-8.2-512.jdbc4
scannotation-1.0.2
slf4j-api-1.6.3
slf4j-log4j12-1.6.3
spring-orm-3.0.5.RELEASE
spring-tx-3.0.5.RELEASE
vraptor-3.4.0
xstream-1.3.1

Tenta colocar @ApplicationScoped na classe CriadorDeSession.

Guip08, muito obrigado… Agora funcionou…

Na apostila não dizia para anotar a classe CriadorDeSession apenas a CriadorDeSessionFactory…

Muito obrigado novamente…

então, o CriadorDeSession precisa ser de request, então não pode ter o @ApplicationScoped!

o problema é que o seu UsuarioDAO é @SessionScoped, então ele vai usar a session de uma requisição anterior…

tire o @SessionScoped do UsuarioDAO que vai funcionar.

[quote=Lucas Cavalcanti]então, o CriadorDeSession precisa ser de request, então não pode ter o @ApplicationScoped!

o problema é que o seu UsuarioDAO é @SessionScoped, então ele vai usar a session de uma requisição anterior…

tire o @SessionScoped do UsuarioDAO que vai funcionar.

[/quote]

Lucas, funcionou direitinho… Valeu…

Danillo,

tem como mostrar como vc usou a CriadorDeSession e a CriadorDeSessionFactory ?

Pois não tem vc utilizando elas … apenas criando.