[RESOLVIDO] vRaptor - Caused by: java.lang.IllegalStateException: EntityManager is closed

Eu achei ter resolvido esse problema, mas está acontecendo algo muito estranho…
A EntityManager fica ocilando, as vezes ele faz as query’s, as vezes da esse erro

Caused by: java.lang.IllegalStateException: EntityManager is closed

Tecnologias usadas: vRaptor, JPA // Banco de dados = AZURE

Aqui estão minhas respectivas classes:

[code]package br.com.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Usuario extends AbstractEntity {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="Usuario_id")
private int id;
private String nome;
private String email;
private String senha;
private int ativo;

public int getId() {
	return id;
}

public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getEmail() {
	return email;
}
public void setEmail(String email) {
	this.email = email;
}
public String getSenha() {
	return senha;
}
public void setSenha(String senha) {
	this.senha = senha;
}

public int getAtivo() {
	return ativo;
}

public void setAtivo(int ativo) {
	this.ativo = ativo;
}

@Override
public void setId(int id) {
	this.id = id;
	
}

}
[/code]

[code]package br.com.controller;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.annotation.Public;
import br.com.business.UsuarioBusiness;
import br.com.model.Usuario;
import br.com.session.UserSession;
import br.com.utils.Utils;

@Public
@Resource
public class IndexController {

private Result result;
private UserSession userSession;
private UsuarioBusiness usuarioBusiness;

public IndexController(UsuarioBusiness usuarioBusiness) {
	this.usuarioBusiness = usuarioBusiness;
}

@Get("/")
public void index() {


}

@Path("/welcome")
public void welcome(Usuario usuario){
	
}

@Public
@Post("/autenticar")
public void autenticar(Usuario usuario) {
	System.out.println("Entrou!");
	System.out.println(usuario.getEmail());
	System.out.println(usuario.getSenha());
	
    Usuario user = usuarioBusiness.autenticar(usuario.getEmail(), usuario.getSenha());
    
    System.out.println("Aqui!");
   if(user.equals(null)){
	   System.out.println("If");
	   result.include("error", Utils.i18n("email.senha.incorreta")).redirectTo(this.getClass()).index();
	   System.out.println("If_Error");
   }else {
	   System.out.println("Else");   
   }
}

@Get("/logout")
public void logout() {
    userSession.logout();
    result.redirectTo(this.getClass()).index();
}

}[/code]

[code]package br.com.business;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.model.Usuario;

@SessionScoped
@Component
public class UsuarioBusiness extends GenericBusiness{

	    private final Logger LOGGER = Logger.getLogger(UsuarioBusiness.class);
		protected UsuarioBusiness(EntityManager manager) {
			super(manager);
			// TODO Auto-generated constructor stub
		}

	    public Usuario autenticar(String email, String senha) {
	        try {
	        	System.out.println("Entrou em autenticar");

// System.out.println(email);
// System.out.println(senha);
Query query = manager.createQuery(“from Usuario where email = :email and senha = :senha”);
query.setParameter(“email”, email);
query.setParameter(“senha”, senha);
// System.out.println(“Fez a query”);

	            return (Usuario) query.getSingleResult();
	        } catch (NoResultException e) {
	            return null;
	        }
	    }
	    
	    public void cadastrar(Usuario usuario) {

// System.out.println(“Entrou em cadastrar”);
Query query = manager.createNativeQuery(“exec UsuarioI ?,?,?,?”);
// System.out.println(“Entrou!”);

        	  query.setParameter(1, usuario.getNome());
        	  query.setParameter(2, usuario.getSenha());
        	  query.setParameter(3, usuario.getEmail());
        	  query.setParameter(4,1);
        	 
        	  Object id = query.getSingleResult();  
       
    }

}[/code]

Meu Abstract GenericBusiness

[code]package br.com.business;

import java.lang.reflect.ParameterizedType;
import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.caelum.vraptor.ioc.Component;
import br.com.model.AbstractEntity;

@Component
public abstract class GenericBusiness implements GenericRepository {

protected final EntityManager manager;
private final Class<T> clazz;

protected GenericBusiness(EntityManager manager) {
	this.manager = manager;

	@SuppressWarnings("unchecked")
	Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

	this.clazz = clazz;
}

public Collection<T> all() {
	Query query = manager.createQuery("from " + clazz.getName());

	@SuppressWarnings("unchecked")
	Collection<T> list = query.getResultList();

	return list;
}

public T getById(int id) {
	return manager.find(clazz, id);
}

public void remove(T entity) {
	//manager.remove(manager.getReference(clazz, entity.getId()));
}

public T save(T entity){
	return manager.merge(entity);
}

public T merge(T entity){
	return manager.merge(entity);
}

}[/code]

Aqui está meu console:

[code]Entrou!
a
a
Entrou em autenticar
Jun 28, 2013 3:39:50 PM org.apache.catalina.core.ApplicationContext log
SEVERE: Unhandled exception occurred whilst decorating page
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.IllegalStateException: EntityManager 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.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
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.environment.EnvironmentInterceptor.intercept(EnvironmentInterceptor.java:37)
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.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.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.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.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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
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:91)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
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:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: EntityManager is closed
at org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:89)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:272)
at br.com.business.UsuarioBusiness.autenticar(UsuarioBusiness.java:29)
at br.com.controller.IndexController.autenticar(IndexController.java:44)
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)
… 53 more

Jun 28, 2013 3:39:50 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/DiyProject] threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.IllegalStateException: EntityManager 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.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
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.environment.EnvironmentInterceptor.intercept(EnvironmentInterceptor.java:37)
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.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.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.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.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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
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:91)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
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:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: EntityManager is closed
at org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:89)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:272)
at br.com.business.UsuarioBusiness.autenticar(UsuarioBusiness.java:29)
at br.com.controller.IndexController.autenticar(IndexController.java:44)
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)
… 53 more
[/code]

SOLUÇÃO:

O que estava ocorrendo era que eu tinha uma anotação de @SessionScope e um EM na mesma classe, segundo Lucas Cavalcanti (quem me auxiliou na resolução do problema), eu estava abrindo uma session e dps usava um EM que é um escope de request. Ou seja, na 2a requisição ele estava guardando o EM da requisição anterior.

Mudei minha anotação @SessionScope para minha classe Usuario e está resolvido! :smiley:

Agradecimentos, Lucas Cavalcanti

qual classe vc tá usando pra abrir o EntityManager?

Estou usando JPA, não sei ao certo se eu tenho esse controle de abrir e fechar a EntityManager, mas a classe que aparentemente mexe com isso é a GenericBusiness.

[code]package br.com.business.common;

import java.lang.reflect.ParameterizedType;
import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.caelum.vraptor.ioc.Component;
import br.com.business.GenericRepository;
import br.com.model.common.AbstractEntity;

@Component
public abstract class GenericBusiness implements GenericRepository {

protected final EntityManager manager;
private final Class<T> clazz;

protected GenericBusiness(EntityManager manager) {
	this.manager = manager;

	@SuppressWarnings("unchecked")
	Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

	this.clazz = clazz;
}

public Collection<T> all() {
	Query query = manager.createQuery("from " + clazz.getName());

	@SuppressWarnings("unchecked")
	Collection<T> list = query.getResultList();

	return list;
}

public T getById(int id) {
	return manager.find(clazz, id);
}

public void remove(T entity) {
	//manager.remove(manager.getReference(clazz, entity.getId()));
}

public T save(T entity){
	return manager.merge(entity);
}

public T merge(T entity){
	return manager.merge(entity);
}

}[/code]

vc tem o pacote do VRaptor jpa registrado no web.xml? tem alguma componentFactory de EntityManager no sistema?

Meu web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Diymoob</display-name> <context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param> <context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.util.jpa,br.com.caelum.vraptor.simplemail</param-value> </context-param> <context-param> <param-name>br.com.caelum.vraptor.environment</param-name> <param-value>production</param-value> </context-param> <context-param> <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> <param-value>messages</param-value> </context-param> <filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> <include-prelude>/WEB-INF/jsp/prelude.jspf</include-prelude> </jsp-property-group> </jsp-config> <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <session-config> <session-timeout>5</session-timeout> </session-config> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page> </web-app>

Quanto ao componentFactory, se tiver é internamente, pos quem controla o open/close do EntityManager é o JPA (até onde eu sei :P)

Meu web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Diymoob</display-name> <context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param> <context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.util.jpa,br.com.caelum.vraptor.simplemail</param-value> </context-param> <context-param> <param-name>br.com.caelum.vraptor.environment</param-name> <param-value>production</param-value> </context-param> <context-param> <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> <param-value>messages</param-value> </context-param> <filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> <include-prelude>/WEB-INF/jsp/prelude.jspf</include-prelude> </jsp-property-group> </jsp-config> <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <session-config> <session-timeout>5</session-timeout> </session-config> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page> </web-app>

Quanto ao componentFactory, se tiver é internamente, pos quem controla o open/close do EntityManager é o JPA (até onde eu sei :P)

quem controla o open/close do EntityManager não é a JPA… ela só é a especificação…

quando vc roda dentro de um servidor de aplicação, ele mesmo se encarrega de abrir e fechar o entityManager, mas não é o caso da sua aplicação…

como vc registrou o pacote da jpa do VRaptor, ele é quem abre e fecha o EM. O erro sugere que tem algum EM sendo usado após o seu fechamento…

O problema está aqui:

@SessionScoped  
@Component  
public class UsuarioBusiness extends GenericBusiness<Usuario>{

esse cara é sessionScoped, mas recebe um entityManager que é escopo de request. Ou seja, na 2a requisição ele vai estar guardando o EM da requisição anterior…

algum motivo pra esse cara ser @SessionScoped? se não, remova essa anotação.

[quote=Lucas Cavalcanti]quem controla o open/close do EntityManager não é a JPA… ela só é a especificação…

quando vc roda dentro de um servidor de aplicação, ele mesmo se encarrega de abrir e fechar o entityManager, mas não é o caso da sua aplicação…

como vc registrou o pacote da jpa do VRaptor, ele é quem abre e fecha o EM. O erro sugere que tem algum EM sendo usado após o seu fechamento…

O problema está aqui:

@SessionScoped  
@Component  
public class UsuarioBusiness extends GenericBusiness<Usuario>{

esse cara é sessionScoped, mas recebe um entityManager que é escopo de request. Ou seja, na 2a requisição ele vai estar guardando o EM da requisição anterior…

algum motivo pra esse cara ser @SessionScoped? se não, remova essa anotação.[/quote]

O pior que eu preciso desse @SessionScope, pq preciso pegar os dados do usuario para verificar se ele esta logado, etc…

Existe alguma outra solução para esse meu caso ?

Por exemplo, daria algum problema eu usar esse @SessionScope no Usuario ?

O UsuarioBusiness não precisa ser @SessionScope, já que ele não guarda o Usuário…

crie uma classe diferente, @SessionScope, que guarda o usuario retornado pelo método autenticar do business… daí o business pode ficar como request scoped (o default)