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]

Reply via email to