4

ich Tapisserie 5 mit Federverschluß verwendet wird, diese große kleine Bibliothek mit: https://github.com/code8/tapestry-bootmit Spring-Boot und Daten JPA, immer LazyInitializationException trotz der OpenSesionInViewFilter

aber ich bin mit dem berüchtigten LazyInitializationException trotz meiner Verwendung von OpenSesionInViewFilter bekommen. Vor-und Nachteile von OpenSesionInViewFilter beiseite, würde ich gerne arbeiten mit OpenSessionInViewFilter, wie ich eine große Legacy-Anwendung portieren.

Meine Feder Boot-Konfiguration ist

@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; 
    } 
} 

Ich habe sichergestellt, dass OpenSessionInViewFilter vor dem TapestryFilter geladen wird, und überprüft diese Ausgabe der über die Feder beim Booten. Ich habe die Tapestry-Boot-Bibliothek zu SetOrder (10) auf dem TapestryFilter bearbeitet.

Ich habe auch über das Debuggen verifiziert, dass OpenSessionInViewFilter tatsächlich eine Sitzung erstellt.

In dem Beispiel Stack-Trace der LIE unten, können Sie sehen, dass OpenSessionInViewFilter verwendet wird.

Ich habe 2 Ebenen der Dienstschichten:

Tapestry Pages --> XXManagerImpl (e.g, UserManager) --> JpaRepository 

Mein Manager-Dienste sind wie so kommentierte:

@Service 
@Transactional(propagation = Propagation.REQUIRED) 
public class UserManagerImpl implements UserManager, Serializable 

Meine JpaRepositories nicht mit @Transactional noch @Repository (bei kommentierten es darauf ankommt).

Der anfängliche Datenzugriff funktioniert wie erwartet, aber wenn ich versuche, auf ein Lazy initialisiertes Feld zuzugreifen, bekomme ich die LIE.

Wurzel Ausnahme:

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] 

Beispiel Stapelüberwachung:

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 Versionen:

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 
+2

Verwenden Sie nicht den 'OpenSessionInViewFilter', den Sie JPA verwenden, verwenden Sie stattdessen den' OpenEntityManagerInViewFilter'. Die 'OpenSessionInView' ist für den normalen Hibernate, nicht für JPA. –

+0

@ M.Deinum Das hat den Trick gemacht. Vielen Dank! Wenn Sie den Kommentar als Antwort einfügen, akzeptiere ich ihn. – Casey

+0

@ M.Deinum Ping! Wenn Sie das als Antwort hinzufügen, kann ich es akzeptieren. – Casey

Antwort

7

Die OpenSessionInViewFilter ist für die Verwendung mit der Ebene API Ruhezustand. Während die OpenEntityManagerInViewFilter ist für die Verwendung mit der JPA API (und funktioniert auch für andere JPA-Anbieter).

Um Ihr Problem zu beheben, verwenden Sie den entsprechenden Filter für die von Ihnen verwendete Technologie, in Ihrem Fall die OpenEntityManagerInViewFilter.

Verwandte Themen