Hi, there are multiple requests going on probably (e.g. because of redirects),
You should put a breakpoint into WicketFilter to debug the requests. HTH Sven On 09/02/2011 08:03 PM, Florian B. wrote: > Hi > > I've got some issues with the OpenSessionInViewFilter I integrated into a > Wicket application to get rid of the LazyLoadingException problem. > > So my problem is. I got a login page with a SignInPanel. When a user tries > to log into the web site his credentials are passed to the authentication() > method of a Session class which extends AuthenticatedWebSession. In this > method a AuthenticationService tries to load the user form the database, > when it succeeds the user is stored in the session. The method in the > AuthenticationService class which loads the user is annotated with > @Transactional. After the user is loaded procession of the request goes on. > During this getRoles() of the session class is called to check the user's > rights. Therefore getRoles() gets called on the user which was stored in the > session before. getRoles() should normally lazy loads the roles of the user > but unfortunately a LazyLoadingException is thrown. > > This behavior is really strange as I thought the OpenSessionInViewFilter > takes care that all requests to the database within on web request use the > same session. > > To examine this issue further I activate logging on the > OpenSessionInViewFilter. This shows me that the session is opened and closed > multiple times by the OpenSessionInViewFilter during the request. > > It is normal that the session got opened and closed multiple times by the > OpenSessionInViewFilter during a request? > > Does any one has an idea why this happens and how to fix this? > > *My web.xml * > > /<?xml version="1.0" encoding="ISO-8859-1"?> > <web-app xmlns="http://java.sun.com/xml/ns/javaee" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://java.sun.com/xml/ns/javaee > http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" > version="2.5"> > <display-name>StoreFinder</display-name> > <context-param> > <param-name>contextConfigLocation</param-name> > <param-value>classpath:/applicationContext.xml</param-value> > </context-param> > <listener> > > <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> > </listener> > > <filter> > <filter-name>wicket.web</filter-name> > > <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> > <init-param> > <param-name>applicationClassName</param-name> > > <param-value>com.appandmore.storefinder.backend.core.web.StoreFinderApplication</param-value> > </init-param> > <init-param> > <param-name>configuration</param-name> > > <param-value>development</param-value> > </init-param> > </filter> > <filter> > <filter-name>wicket.session</filter-name> > > <filter-class>org.apache.wicket.protocol.http.servlet.WicketSessionFilter</filter-class> > <init-param> > <param-name>filterName</param-name> > <param-value>wicket.web</param-value> > </init-param> > </filter> > <filter> > <filter-name>open.hibernate.session.in.view</filter-name> > > <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> > <init-param> > <param-name>sessionFactoryBeanName</param-name> > <param-value>sessionFactory</param-value> > </init-param> > </filter> > > > <filter-mapping> > <filter-name>open.hibernate.session.in.view</filter-name> > <url-pattern>/*</url-pattern> > </filter-mapping> > <filter-mapping> > <filter-name>wicket.web</filter-name> > <url-pattern>/*</url-pattern> > </filter-mapping> > </web-app> > / > > > *My applicationContext.xml* > / > <?xml version="1.0" encoding="UTF-8"?> > <beans xmlns="http://www.springframework.org/schema/beans" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xmlns:tx="http://www.springframework.org/schema/tx" > xsi:schemaLocation=" > http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans-2.5.xsd > http://www.springframework.org/schema/tx > http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> > > > <bean id="propertyConfigurer" > class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> > <property name="locations"> > <list> > <value>classpath:application.properties</value> > > </list> > </property> > <property name="ignoreResourceNotFound" value="true"/> > </bean> > > <bean id="authenticationService" > class="com.appandmore.storefinder.backend.core.service.security.AuthenticationServiceImpl"> > <constructor-arg ref="userDao"/> > </bean> > > <bean id="offerDao" > class="com.appandmore.storefinder.backend.core.infrastructure.hibernate.OfferDaoImpl"> > <property name="sessionFactory" ref="sessionFactory"/> > </bean> > <bean id="userDao" > class="com.appandmore.storefinder.backend.core.infrastructure.hibernate.UserDaoImpl"> > <property name="sessionFactory" ref="sessionFactory"/> > </bean> > <bean id="roleDao" > class="com.appandmore.storefinder.backend.core.infrastructure.hibernate.RoleDaoImpl"> > <property name="sessionFactory" ref="sessionFactory"/> > </bean> > <bean id="imageDao" > class="com.appandmore.storefinder.backend.core.infrastructure.hibernate.ImageDaoImpl"> > <property name="sessionFactory" ref="sessionFactory"/> > </bean> > <bean id="storeDao" > class="com.appandmore.storefinder.backend.core.infrastructure.hibernate.StoreDaoImpl"> > <property name="sessionFactory" ref="sessionFactory"/> > </bean> > > <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" > destroy-method="close"> > <property name="driverClassName" value="org.h2.Driver"/> > <property name="url" value="jdbc:h2:file:target/db/"/> > <property name="username" value="${jdbc.username}"/> > <property name="password" value="${jdbc.password}"/> > </bean> > > <bean id="sessionFactory" > > class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> > <property name="dataSource" ref="dataSource"/> > <property name="hibernateProperties"> > <props> > <prop > key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> > <prop key="hibernate.show_sql">true</prop> > <prop key="use_outer_join">true</prop> > <prop > key="hibernate.cache.use_second_level_cache">false</prop> > <prop key="hibernate.cache.use_query_cache">true</prop> > <prop > key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop> > > <prop key="hibernate.hbm2ddl.auto">create-drop</prop> > > <prop key="hibernate.connection.pool_size">10</prop> > <prop key="hibernate.jdbc.batch_size">1000</prop> > <prop > key="hibernate.bytecode.use_reflection_optimizer">true</prop> > </props> > </property> > <property name="annotatedClasses"> > <list> > > <value>com.appandmore.storefinder.backend.core.domain.offer.Offer</value> > > > <value>com.appandmore.storefinder.backend.core.domain.store.Image</value> > > <value>com.appandmore.storefinder.backend.core.domain.store.Store</value> > > <value>com.appandmore.storefinder.backend.core.domain.store.OpeningPeriod</value> > > <value>com.appandmore.storefinder.backend.core.domain.store.CommunicationData</value> > > <value>com.appandmore.storefinder.backend.core.domain.user.Role</value> > > <value>com.appandmore.storefinder.backend.core.domain.user.User</value> > > > <value>com.appandmore.storefinder.backend.core.domain.base.BusinessObject</value> > </list> > </property> > > <property name="schemaUpdate" value="${hibernate.schemaUpdate}"/> > </bean> > > <tx:annotation-driven/> > <bean id="transactionManager" > > class="org.springframework.orm.hibernate3.HibernateTransactionManager"> > <property name="sessionFactory" ref="sessionFactory"/> > </bean> > </beans> > / > > > > *Log of the web request which leads to the exception *(user entered login > data and pressed the login button) > > DEBUG - OpenSessionInViewFilter - Using SessionFactory 'sessionFactory' > for OpenSessionInViewFilter > DEBUG - OpenSessionInViewFilter - Opening single Hibernate Session in > OpenSessionInViewFilter > INFO - AuthenticatedSession - User trys to login with username: > [email protected] > Hibernate: select this_.id as id4_0_, this_.createdOn as createdOn4_0_, > this_.editedOn as editedOn4_0_, this_.active as active4_0_, this_.email as > email4_0_, this_.firstname as firstname4_0_, this_.lastname as lastname4_0_, > this_.password as password4_0_ from User this_ where this_.email=? > INFO - AuthenticatedSession - User '[email protected]' is logged > in successfully. > INFO - ClassCryptFactory - using encryption/decryption object > org.apache.wicket.util.crypt.SunJceCrypt@7b6b89ad > DEBUG - OpenSessionInViewFilter - Closing single Hibernate Session in > OpenSessionInViewFilter > DEBUG - OpenSessionInViewFilter - Using SessionFactory 'sessionFactory' > for OpenSessionInViewFilter > DEBUG - OpenSessionInViewFilter - Opening single Hibernate Session in > OpenSessionInViewFilter > ERROR - DefaultExceptionMapper - Unexpected error occurred > org.apache.wicket.WicketRuntimeException: Can't instantiate page using > constructor public > com.appandmore.storefinder.backend.core.web.page.StoreTablePage() > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:173) > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:59) > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:95) > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:43) > at > org.apache.wicket.DefaultMapperContext.newPageInstance(DefaultMapperContext.java:107) > at > org.apache.wicket.request.handler.PageProvider.getPageInstance(PageProvider.java:266) > at > org.apache.wicket.request.handler.PageProvider.getPageInstance(PageProvider.java:160) > at > org.apache.wicket.request.handler.render.PageRenderer.getPage(PageRenderer.java:78) > at > org.apache.wicket.request.handler.render.WebPageRenderer.renderPage(WebPageRenderer.java:105) > at > org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:219) > at > org.apache.wicket.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:139) > at > org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:717) > at > org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:63) > at > org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:212) > at > org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:253) > at > org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:160) > at > org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:216) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089) > at > org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) > 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:295) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:503) > at > org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:827) > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:511) > at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:210) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:379) > at > org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:361) > at > org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442) > Caused by: java.lang.reflect.InvocationTargetException > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:155) > ... 36 more > Caused by: org.hibernate.LazyInitializationException: failed to lazily > initialize a collection of role: > com.appandmore.storefinder.backend.core.domain.user.User.roles, no session > or session was closed > at > org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) > at > org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) > at > org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368) > at > org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111) > at > org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:186) > at > com.appandmore.storefinder.backend.core.web.AuthenticatedSession.getRoles(AuthenticatedSession.java:68) > at > org.apache.wicket.authroles.authentication.AuthenticatedWebApplication.hasAnyRole(AuthenticatedWebApplication.java:78) > at > org.apache.wicket.authroles.authorization.strategies.role.AbstractRoleAuthorizationStrategy.hasAny(AbstractRoleAuthorizationStrategy.java:62) > at > org.apache.wicket.authroles.authorization.strategies.role.annotations.AnnotationsRoleAuthorizationStrategy.isInstantiationAuthorized(AnnotationsRoleAuthorizationStrategy.java:60) > at > org.apache.wicket.authorization.strategies.CompoundAuthorizationStrategy.isInstantiationAuthorized(CompoundAuthorizationStrategy.java:62) > at org.apache.wicket.Application$1.onInstantiation(Application.java:278) > at > org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:36) > at > org.apache.wicket.application.ComponentInstantiationListenerCollection$1.notify(ComponentInstantiationListenerCollection.java:34) > at > org.apache.wicket.util.listener.ListenerCollection.notify(ListenerCollection.java:79) > at > org.apache.wicket.application.ComponentInstantiationListenerCollection.onInstantiation(ComponentInstantiationListenerCollection.java:32) > at org.apache.wicket.Component.<init>(Component.java:676) > at org.apache.wicket.MarkupContainer.<init>(MarkupContainer.java:117) > at org.apache.wicket.Page.<init>(Page.java:211) > at org.apache.wicket.Page.<init>(Page.java:175) > at org.apache.wicket.markup.html.WebPage.<init>(WebPage.java:72) > at > com.appandmore.storefinder.backend.common.web.page.BasePage.<init>(BasePage.java:30) > at > com.appandmore.storefinder.backend.core.web.page.StoreTablePage.<init>(StoreTablePage.java:23) > ... 41 more > DEBUG - OpenSessionInViewFilter - Closing single Hibernate Session in > OpenSessionInViewFilter > > -- > View this message in context: > http://apache-wicket.1842946.n4.nabble.com/Lazy-loading-exception-despite-of-OpenSessionInViewFilter-and-object-loading-within-a-request-tp3786744p3786744.html > Sent from the Users forum mailing list archive at Nabble.com. > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
