OpenEntityManagerInViewFilter e VRaptor

8 respostas
Lucas_Cavalcanti

como vc está pegando as Session’s nas suas classes?

se vc está usando um ComponentFactory pra isso, é só remover o método que fecha a sessão

8 Respostas

Lucas_Cavalcanti

faça o seguinte… tire os componentes utilitários do SpringProvider… se vc tá injetando via @PersistenceContext vc não vai precisar deles

Lucas_Cavalcanti

tenta dar uma olhada na seção 12.6.3 desse site:

http://static.springsource.org/spring/docs/2.5.x/reference/orm.html

ve se isso te ajuda a resolver esse problema…

de qqer forma, se vc registrar os componentes da JPA do VRaptor, vc não precisa do OpenEntityManagerInViewFilter… eles já fazem isso, basta receber no construtor dos seus daos um EntityManager…

o único problema é que seu persistence-unit tem que se chamar “default” ou vc tem que estender o EntityManagerCreator e trocar o persistence-unit

seufagner

Mesmo configurando o OpenEntityManagerInViewFilter, a sessão é fechada. Como utilizá-lo integrado ao VRaptor 3.1 ?

Como faço para que ele faça parte do stack de interceptors controlados pelo VRaptor ? O VRaptor encerra a cadeia de filtros por ele gerenciados e, posteriormente, de modo que o OpenEntityManagerInViewFilter já recebe a sessão fechada, não tem como mantê-la aberta (duh)? Como ele é o próximo declarado no web.xml, deve passar por ele ou estou enganado?

Sendo assim, como o VRaptor que inicializa o Spring internamente, ele deve estar após o filter do VRaptor, como até foi sugerido para mim pelo Lucas.

Minha configuração do web.xml

<!-- if you are using a servlet 3.0 container as glassfish 3 or jetty 8, you dont need this filter configuration --> <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <!-- Filtro do Open Session In View controlado pelo Spring --> <filter> <display-name>Open EntityManager In View Filter</display-name> <filter-name>OpenEntityManagerInView</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> <init-param> <param-name>flushMode</param-name> <param-value>AUTO</param-value> </init-param> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <filter-mapping> <filter-name>OpenEntityManagerInView</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>

Stacktrace

HTTP ERROR: 500

org.hibernate.SessionException: Session is closed!

RequestURI=/vraptor/advogado/home
Caused by:

br.com.caelum.vraptor.InterceptionException: org.hibernate.SessionException: Session is closed!
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:46)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
seufagner

To injetando via @PersistenceContext (estou usando EntityManager) e utilizando os utilitarios do VRaptor no SpringProvider.

Vou tentar estendendo os metodos dos componentes utilitarios que fecham a sessao e dou o feedback aqui.

Obrigado camarada

seufagner

Mesmo retirando qualquer utilitario do VRaptor que porventura venha a fechar a sessao ele continua o fazendo.

Esta configurando o OpenEntityManagerInView corretamente, como informa no console:

15:38:35,951 INFO [VRaptor ] VRaptor 3 successfuly initialized 15:38:35,960 DEBUG [OpenEntityManagerInViewFilter] Initializing filter 'OpenEntityManagerInView' 15:38:35,980 DEBUG [OpenEntityManagerInViewFilter] Filter 'OpenEntityManagerInView' configured successfully

15:38:55,861 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'executeMethodInterceptor' via constructor to bean named 'defaultValidator' 15:38:55,868 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'executeMethodInterceptor' 15:38:55,888 DEBUG [SharedEntityManagerCreator$SharedEntityManagerInvocationHandler] Creating new EntityManager for shared EntityManager invocation 15:38:56,372 DEBUG [EntityManagerFactoryUtils] Closing JPA EntityManager 2010-01-30 15:38:56.377::WARN: /vraptor/advogado/home br.com.caelum.vraptor.InterceptionException: org.hibernate.SessionException: Session is closed! at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:285) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:821) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:368) at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)

sinistro! :frowning:

seufagner

Tirei todos, ta tudo gerenciado pelo Spring num arquivo application-datasource.xml

O erro persiste

16:06:29,535 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'executeMethodInterceptor' via constructor to bean named 'defaultMethodInfo' 16:06:29,535 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'executeMethodInterceptor' via constructor to bean named 'defaultValidator' 16:06:29,540 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'executeMethodInterceptor' 16:06:29,563 DEBUG [SharedEntityManagerCreator$SharedEntityManagerInvocationHandler] Creating new EntityManager for shared EntityManager invocation 16:06:29,760 DEBUG [EntityManagerFactoryUtils] Closing JPA EntityManager 2010-01-30 16:06:29.765::WARN: /vraptor/advogado/home br.com.caelum.vraptor.InterceptionException: org.hibernate.SessionException: Session is closed! at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

seufagner

Lucas Cavalcanti:
tenta dar uma olhada na seção 12.6.3 desse site:

http://static.springsource.org/spring/docs/2.5.x/reference/orm.html

ve se isso te ajuda a resolver esse problema…

de qqer forma, se vc registrar os componentes da JPA do VRaptor, vc não precisa do OpenEntityManagerInViewFilter… eles já fazem isso, basta receber no construtor dos seus daos um EntityManager…

o único problema é que seu persistence-unit tem que se chamar “default” ou vc tem que estender o EntityManagerCreator e trocar o persistence-unit

Entendi. Eu prefiro deixar o VRaptor cuidar disso para mim. Vou fazer com que o DAO receba o entitymanager no construtor e dou o feedback.

Muito obrigado lucas!

Ps. Lembrando que estou utilizando o Spring 3.0 esta documentação é do 2.5

seufagner

Resolvido!

Vai valer a pena continuar insistindo no VRaptor. rs

Valeu lucas

Criado 30 de janeiro de 2010
Ultima resposta 30 de jan. de 2010
Respostas 8
Participantes 2