今天有一个朋友问了我一个问题,他使用的是Hibernate/Spring/Struts架构,配置使用Spring的 OpenSessionInView Filter,但是发现不生效,lazy的集合属性在页面访问的时候仍然报session已经关闭的错误。我和他一起检查了所有的配置和相关的代码,但是 没有发现任何问题。经过调试发现,应用程序使用的Session和OpenSessionInView Filter打开的Session不是同一个,所以OpenSessionInView模式没有生效,但是为什么他们不使用同一个Session呢?

检查了一遍Spring的相关源代码,发现了问题的根源:

通常在Web应用中初始化Spring的配置,我们会在web.xml里面配置一个Listener,即:

Xml代码  
  1. <listener>
  2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3. </listener>

如果使用Struts,那么需要在Struts的配置文件struts-config.xml里面配置一个Spring的plugin:ContextLoaderPlugIn。

实际上ContextLoaderListener和ContextLoaderPlugIn的功能是重叠的,他们都是进行Spring配置的初 始化工作的。因此,如果你不打算使用OpenSessionInView,那么你并不需要在web.xml里面配置 ContextLoaderListener。

好了,但是你现在既需要Struts集成Spring,又需要OpenSessionInView模式,问题就来了!

由于ContextLoaderListener和ContextLoaderPlugIn功能重叠,都是初始化Spring,你不应该进行两次 初始化,所以你不应该同时使用这两者,只能选择一个,因为你现在需要集成Struts,所以你只能使用ContextLoaderPlugIn。

但是令人困惑的是,ContextLoaderListener和ContextLoaderPlugIn有一个非常矛盾的地方!

ContextLoaderListener初始化spring配置,然后把它放在ServletContext对象里面保存:

Java代码  
  1. servletContext.setAttribute(
  2. WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);;

请注意,保存的对象的key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE!

但是ContextLoaderPlugIn初始化spring配置,然后把它放在ServletContext对象里面保存:

Java代码  
  1. String attrName = getServletContextAttributeName();;
  2. getServletContext();.setAttribute(attrName, wac);;

这个attrName和WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE名字是不一样的!

如果仅仅是名字不一样,问题还不大,你仍然可以放心使用ContextLoaderPlugIn,但是当你使用OpenSessionInView的时候,OpenSessionInViewFilter是使用哪个key取得spring配置的呢?

Java代码  
  1. WebApplicationContext wac =
  2. WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext(););;

显然,OpenSessionInViewFilter是按照WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE这个key去拿spring配置的!

我们整理一下思路:

ContextLoaderPlugIn保存spring配置的名字叫做attrName;

,ContextLoaderListener保存spring配置的名字叫做WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;

而OpenSessionInView是按照WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE这个名字去取得spring配置的!

而你的应用程序却是按照attrName去取得spring的配置的!

所以,OpenSessionInView模式失效!

解决办法:

修改ContextLoaderPlugIn代码,在getServletContext().setAttribute(attrName, wac);这个地方加上一行代码:

getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);

或者修改OpenSessionInViewFilter,让它按照attrName去取得spring配置。

文章出处:

http://www.iteye.com/topic/15057

转载于:https://blog.51cto.com/woshisap/930535

主题:Hibernate/Spring/Struts架构使用OpenSessionInView的问题相关推荐

  1. 基于Spring+Struts+Hibernate实现的健康管理平台

    源码及论文下载:http://www.byamd.xyz/tag/java/ 摘要 随着网络技术的不断发展,网站的开发与运用变得更加广泛.这次采用java语言SSH框架(Spring,Struts,H ...

  2. 解释spring,struts,hibernate优缺点

    解释spring,struts,hibernate优缺点 Struts优点:对视图层进行封装 更好的分离视图层和控制层 对数据进行封装 缺点: 1 .转到展示层时,需要配置forward,每一次转到展 ...

  3. Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架

    Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...

  4. java+jsp+mysql实现汽车销售管理系统CarSaleManageSystem 前台买家 后台卖家 SSH(spring+struts+hibernate)开发框架

    java+jsp+mysql实现汽车销售管理系统CarSaleManageSystem 项目简介 系统分前台和后台 前台是普通用户可以注册.登陆.修改个人信息.修改密码.浏览汽车.添加个人购车信息.查 ...

  5. 沉淀再出发:Spring的架构理解

    沉淀再出发:Spring的架构理解 一.前言 在Spring之前使用的EJB框架太庞大和重量级了,开发成本很高,由此spring应运而生.关于Spring,学过java的人基本上都会慢慢接触到,并且在 ...

  6. mysql智能停车场,智能停车场管理系统设计与实现(Hibernate和Struts,MySQL)

    智能停车场管理系统设计与实现(Hibernate和Struts,MySQL)(论文11800字,程序代码,MySQL数据库) 摘要:本论文旨在设计一款停车管理系统.本系统基于J2EE标准,采用B/S架 ...

  7. Hibernate+Spring+Struts2+ExtJS开发CRUD功能

    http://blog.csdn.net/myloon/archive/2007/11/08/1873652.aspx-----多谢这么好的文章 Hibernate+Spring+Struts2+Ex ...

  8. session传递参数_分布式 Session 之 Spring Session 架构与设计

    作者 | 李增光 杏仁后端工程师.「只有变秃,才能变强!」 ​前言 开始进行 Web 开发时,我们可能会遇到这样的情况,当服务器重启之后,之前的登录状态会失效需要重新登录.又或者你的应用程序部署了不止 ...

  9. Struts2+Hibernate+Spring 整合示例

    转自:https://blog.csdn.net/tkd03072010/article/details/7468769 Struts2+Hibernate+Spring 整合示例 Spring整合S ...

最新文章

  1. CveService.java
  2. iOS学习之基本概念
  3. R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...
  4. 高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...
  5. 斯坦福CS224n追剧计划【大结局】:NLP和深度学习的未来
  6. java override 用法_Java中@Override的作用
  7. UI设计实用素材|线框套件 WRFRM
  8. Lua 正确的尾调用(proper tail call)
  9. Ubuntu启动密码丢失的找回
  10. Mac OS X 使用sshfs挂载Linux远程服务器磁盘
  11. C++,error c2662 cannot convert 'this' pointer from 'const A' to 'A '
  12. Ubuntu 18安装腾达u12 无线网卡驱动
  13. 软件测评师的一些重点①
  14. java 稀疏贝叶斯算法_稀疏贝叶斯学习(SparseBayesianLearning).PDF
  15. C++900行代码实现中国象棋游戏规则以及相关功能
  16. 2019年10月计算机系统结构答案,2019年计算机系统结构复习题.doc
  17. Tensorflow使用object_detetcion安装教程
  18. STM32——中断优先级分组
  19. 计算机面试专业英语词汇,面试常用英语,英语面试常用词汇?
  20. 性能:到底什么是性能测试

热门文章

  1. python selenium 进入新标签页_python 爬虫之selenium可视化爬虫
  2. lisp将图元追加选择_DNF:哈林防具和海博伦如何选择首饰提升率最大?你选对了吗?...
  3. Linux系统文件用户共享,Linux操作系统下的共享文件夹用户设定
  4. 虚拟机centos7.3不能启动
  5. Java讲课笔记29:Swing入门
  6. Going to 的将来时态_47
  7. 复数基础——例题_4
  8. java主动对象模式_POCO的主动对象
  9. 2017.9.30 物流运输 思考记录
  10. 每日小记2017.2.20