开发者社区 问答 正文

Struts2,Hibernate , Spring中懒加载问题:报错

web.xml中配置如下代码:

<!-- 懒加载 -->

<!-- 配置opensessioninview解决懒加载,本质一个过滤器. -->
<filter>
       <filter-name>OpenSessionInViewFilter</filter-name>
       <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
       <filter-name>OpenSessionInViewFilter</filter-name>
       <url-pattern>/*</url-pattern>

</filter-mapping>

但是,还是给我报no Session

严重: Servlet.service() for servlet jsp threw exception
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at com.wen.entity.Usertype_$$_javassist_1.getTypeName(Usertype_$$_javassist_1.java)
at org.apache.jsp.top_jsp._jspService(top_jsp.java:92)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)


很郁闷,网上有人说是访问的不是同一个session,看了半天,没弄明白。求快速有效的方法解决。谢谢!

展开
收起
kun坤 2020-06-14 09:48:52 504 分享 版权
阿里云 AI 助理回答

遇到org.hibernate.LazyInitializationException: could not initialize proxy - no Session这个异常,通常是因为尝试在Hibernate Session关闭后访问延迟加载(lazy-loaded)的对象属性。你已经在web.xml中配置了Spring的OpenSessionInViewFilter来解决这个问题,但似乎没有生效。

这里有几个可能的原因和对应的解决方案:

  1. 过滤器映射路径问题:确保你的<url-pattern>正确地匹配了所有需要保持Session打开的请求。你已经使用了/*,这应该能捕获所有请求,看起来这部分配置是正确的。

  2. Spring版本或依赖不兼容:确认你的Spring和Hibernate版本之间是否兼容。有时候,不同版本间的API变化可能导致这类问题。

  3. Spring配置问题:确保Spring的配置正确识别并启用了OpenSessionInViewFilter。如果你使用的是Spring Boot或其他更现代的Spring配置方式,可能需要在相应的配置类中添加Bean定义而不是直接在web.xml中配置。

  4. 事务管理冲突:检查是否有事务管理配置不当,导致在某些操作完成后过早关闭了Session。

  5. JSP直接访问实体:如果在JSP页面中直接访问了需要懒加载的实体属性,即使有OpenSessionInViewFilter,也可能因为某些原因Session提前关闭。尽量避免在视图层直接操作实体,可以考虑在Controller层就将必要的数据提取出来传递给视图。

  6. 其他过滤器或拦截器影响:如果有其他的过滤器或拦截器也在处理请求链,确保它们没有以某种方式干扰了OpenSessionInViewFilter的工作。

  7. 重启应用服务器:有时候,尽管修改了配置,但如果没有重启应用服务器,新配置可能不会生效。确保在调整配置后重启了你的应用。

针对以上情况,你可以尝试以下步骤来进一步诊断和解决问题:

  • 确认Spring和Hibernate的版本兼容性。
  • 检查Spring的配置文件,确保没有遗漏或错误的配置。
  • 查看日志输出,寻找有关Session管理或OpenSessionInViewFilter初始化的任何警告或错误信息。
  • 如果可能,尝试在Controller层预加载需要的数据,避免在JSP中触发懒加载。
  • 确保应用服务器已完全重启。

如果以上方法都不能解决问题,建议详细检查应用的日志,特别是Spring和Hibernate相关的日志,以便找到更具体的错误线索。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答