I'm using tapestry 5 with spring boot, using this great little library: https://github.com/code8/tapestry-boot
However I'm getting the infamous LazyInitializationException despite my use of OpenSesionInViewFilter. Pros and cons of OpenSesionInViewFilter aside, I'd like to get this working with OpenSesionInViewFilter as I'm porting a large legacy application.
My spring boot configuration is
@SpringBootApplication
public class Launcher {
public static void main(String[] args) {
new SpringApplicationBuilder(Launcher.class)
.web(true)
.run(args);
}
@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
return new HibernateJpaSessionFactoryBean();
}
@Bean
public FilterRegistrationBean registerOpenSessionInViewFilterBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
OpenSessionInViewFilter filter = new OpenSessionInViewFilter();
registrationBean.setFilter(filter);
registrationBean.setOrder(5);
return registrationBean;
}
}
I've ensured that OpenSessionInViewFilter is being loaded before the TapestryFilter, and verified this via spring's output on boot. I edited the tapestry-boot library to setOrder(10) on the TapestryFilter.
I've also verified via debugging that OpenSessionInViewFilter is actually creating a session.
In the example stack trace of the LIE below, you can see that OpenSessionInViewFilter is being used.
I have 2 levels of service layers:
Tapestry Pages --> XXManagerImpl (e.g, UserManager) --> JpaRepository
My Manager services are annotated like so:
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class UserManagerImpl implements UserManager, Serializable
My JpaRepositories are not annotated with @Transactional nor @Repository (in case it matters).
The initial data acess works as expected, but when I try to access a Lazy initialized field, I get the LIE.
Root exception:
Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:147) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:260) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:68) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
at org.mypackage.model.submodel.othermodel$$_jvstde5_1.getName(OtherModel$$_jvstde5_1.java) ~[main/:na]
at $InternalPropertyConduit_97875b5f2687.get(Unknown Source) ~[na:na]
at org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:63) ~[tapestry-core-5.4.1.jar:na]
Example stack trace:
org.apache.tapestry5.ioc.internal.OperationException: Render queue error in Expansion[PropBinding[expansion mypage/Edit(model.othermodel.name)]]: could not initialize proxy - no Session
at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:186) ~[tapestry-ioc-5.4.1.jar:na]
at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.run(OperationTrackerImpl.java:62) ~[tapestry-ioc-5.4.1.jar:na]
at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.run(PerThreadOperationTracker.java:60) ~[tapestry-ioc-5.4.1.jar:na]
at org.apache.tapestry5.ioc.internal.RegistryImpl.run(RegistryImpl.java:1254) ~[tapestry-ioc-5.4.1.jar:na]
at org.apache.tapestry5.internal.services.RequestOperationTracker.handlePageRender(RequestOperationTracker.java:66) ~[tapestry-core-5.4.1.jar:na]
at $ComponentRequestHandler_94ac265764f4.handlePageRendewn Source) ~[na:na]
at $ComponentRequestHandler_94ac2657642d.handlePageRender(Unknown Source) ~[na:na]
at org.apache.tapestry5.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:55) ~[tapestry-core-5.4.1.jar:na]
at $Dispatcher_94ac265764c8.dispatch(Unknown Source) ~[na:na]
at $Dispatcher_94ac26576473.dispatch(Unknown Source) ~[na:na]
at org.apache.tapestry5.modules.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:305) ~[tapestry-core-5.4.1.jar:na]
at org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) ~[tapestry-core-5.4.1.jar:na]
at $RequestHandler_94ac265764c7.service(Unknown Source) [na:na]
at org.apache.tapestry5.modules.TapestryModule$3.service(TapestryModule.java:846) [tapestry-core-5.4.1.jar:na]
at $RequestHandler_94ac265764c7.service(Unknown Source) [na:na]
at org.apache.tapestry5.modules.TapestryModule$2.service(TapestryModule.java:836) [tapestry-core-5.4.1.jar:na]
at $RequestHandler_94ac265764c7.service(Unknown Source) [na:na]
at org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:89) [tapestry-core-5.4.1.jar:na]
at $RequestHandler_94ac265764c7.service(Unknown Source) [na:na]
at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:105) [tapestry-core-5.4.1.jar:na]
at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:95) [tapestry-core-5.4.1.jar:na]
at org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:83) [tapestry-ioc-5.4.1.jar:na]
at org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:119) [tapestry-core-5.4.1.jar:na]
at $RequestHandler_94ac265764c7.service(Unknown Source) [na:na]
at $RequestHandler_94ac2657649d.service(Unknown Source) [na:na]
at org.apache.tapestry5.modules.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:256) [tapestry-core-5.4.1.jar:na]
apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:45) [tapestry-upload-5.4.1.jar:na]
at $HttpServletRequestHandler_94ac265764c4.service(Unknown Source) [na:na]
at org.apache.tapestry5.internal.gzip.GZipFilter.service(GZipFilter.java:59) [tapestry-core-5.4.1.jar:na]
at $HttpServletRequestHandler_94ac265764c4.service(Unknown Source) [na:na]
at org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) [tapestry-core-5.4.1.jar:na]
at $HttpServletRequestFilter_94ac2657645a.service(Unknown Source) [na:na]
at $HttpServletRequestHandler_94ac265764c4.service(Unknown Source) [na:na]
at org.apache.tapestry5.modules.TapestryModule$1.service(TapestryModule.java:796) [tapestry-core-5.4.1.jar:na]
at $HttpServletRequestHandler_94ac265764c4.service(Unknown Source) [na:na]
at $HttpServletRequestHandler_94ac26576458.service(Unknown Source) [na:na]
at info.code8.tapestry.TapestryFilter.doFilter(TapestryFilter.java:49) [tapestry-boot-0.1.0-SNAPSHOT.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [tomcat-embed-core-8.0.32.jar:8.0.32]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) [tomcat-embed-core-8.0.32.jar:8.0.32]
at org.springframework.orm.hibernate5.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151) [spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) [tomcat-embed-core-8.0.32.jar:8.0.32]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
Lib versions:
tapestry : 5.4.1
hibernate : hibernate-core-5.1.0.Final
spring framework : 4.2.5.RELEASE
spring-boot : 1.3.3.RELEASE
spring-data-jpa : 1.10.1.RELEASE // for querydsl 4 support
spring-data-commons: 1.12.1.RELEASE // for querydsl 4 support
The OpenSessionInViewFilter
is for usage with the plain Hibernate API. Whereas the OpenEntityManagerInViewFilter
is for use with the JPA api (and works also for other JPA providers).
To fix your issue use the appropriate filter for the technology you use, in your case the OpenEntityManagerInViewFilter
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With