发生 LazyInitializationException post 引入 @Controller 注解

LazyInitializationException occuring post introducing @Controller Annotation

我们在 Spring 中使用 Method Name Resolver 实现了一个分布式 Web 应用程序。我们现在正在从 Method Name Resolver 迁移到 Spring Annotation (@Controller)。一旦我们做了那个改变,我们面临的大问题就是所有的 LAZY Initialization 都不起作用。我们开始收到以下错误:

2020-11-10 13:12:53,678 DEBUG     o.s.web.servlet.DispatcherServlet:1182 Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'XXXXXXXX'; model is {XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) ~[hibernate-core-4.2.17.Final.jar:4.2.17.Final]
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286) ~[hibernate-core-4.2.17.Final.jar:4.2.17.Final]
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) ~[hibernate-core-4.2.17.Final.jar:4.2.17.Final]

在分析中,我们能够发现,通过方法名称解析器,系统能够延迟初始化对象。在 @Controller 注释中,系统抛出 LazyInitializationError,因为 Session 对象正在关闭并且无法延迟初始化。

克服这个问题的解决方案是什么?如何使用类似于方法名称解析器的@Controller 来维护会话。

我们将不胜感激任何见解。谢谢

听起来你的控制器方法是异步的。如果是这种情况,则不会有会话,因为调用是在不同的线程中完成的,并且会话不会随之而来。 similar question 对此进行了解释并提供了解决方案。 检查您的控制器方法是否有 @Async 注释或类似的东西。如果是这样的话,它肯定会抛出那个错误。

听起来您正在使用“在视图中打开会话”(反)模式。看看 Spring 的 OpenSessionInViewFilter.