Open session in view is a bad idea with a full fledged ajax-Wicket
application as things get unpredictable pretty fast.
Am 02.09.2011 22:34 schrieb "Sven Meier" <[email protected]>:
> 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