Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Spring Boot and Data JPA, getting LazyInitializationException despite the OpenSesionInViewFilter

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
like image 713
Casey Avatar asked Feb 07 '23 02:02

Casey


1 Answers

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.

like image 175
M. Deinum Avatar answered Feb 09 '23 16:02

M. Deinum