主题:Hibernate/Spring/Struts架构使用OpenSessionInView的问题
今天有一个朋友问了我一个问题,他使用的是Hibernate/Spring/Struts架构,配置使用Spring的 OpenSessionInView Filter,但是发现不生效,lazy的集合属性在页面访问的时候仍然报session已经关闭的错误。我和他一起检查了所有的配置和相关的代码,但是 没有发现任何问题。经过调试发现,应用程序使用的Session和OpenSessionInView Filter打开的Session不是同一个,所以OpenSessionInView模式没有生效,但是为什么他们不使用同一个Session呢?
检查了一遍Spring的相关源代码,发现了问题的根源:
通常在Web应用中初始化Spring的配置,我们会在web.xml里面配置一个Listener,即:
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </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对象里面保存:
- servletContext.setAttribute(
- WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);;
请注意,保存的对象的key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE!
但是ContextLoaderPlugIn初始化spring配置,然后把它放在ServletContext对象里面保存:
- String attrName = getServletContextAttributeName();;
- getServletContext();.setAttribute(attrName, wac);;
这个attrName和WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE名字是不一样的!
如果仅仅是名字不一样,问题还不大,你仍然可以放心使用ContextLoaderPlugIn,但是当你使用OpenSessionInView的时候,OpenSessionInViewFilter是使用哪个key取得spring配置的呢?
- WebApplicationContext wac =
- 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的问题相关推荐
- 基于Spring+Struts+Hibernate实现的健康管理平台
源码及论文下载:http://www.byamd.xyz/tag/java/ 摘要 随着网络技术的不断发展,网站的开发与运用变得更加广泛.这次采用java语言SSH框架(Spring,Struts,H ...
- 解释spring,struts,hibernate优缺点
解释spring,struts,hibernate优缺点 Struts优点:对视图层进行封装 更好的分离视图层和控制层 对数据进行封装 缺点: 1 .转到展示层时,需要配置forward,每一次转到展 ...
- Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架
Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...
- java+jsp+mysql实现汽车销售管理系统CarSaleManageSystem 前台买家 后台卖家 SSH(spring+struts+hibernate)开发框架
java+jsp+mysql实现汽车销售管理系统CarSaleManageSystem 项目简介 系统分前台和后台 前台是普通用户可以注册.登陆.修改个人信息.修改密码.浏览汽车.添加个人购车信息.查 ...
- 沉淀再出发:Spring的架构理解
沉淀再出发:Spring的架构理解 一.前言 在Spring之前使用的EJB框架太庞大和重量级了,开发成本很高,由此spring应运而生.关于Spring,学过java的人基本上都会慢慢接触到,并且在 ...
- mysql智能停车场,智能停车场管理系统设计与实现(Hibernate和Struts,MySQL)
智能停车场管理系统设计与实现(Hibernate和Struts,MySQL)(论文11800字,程序代码,MySQL数据库) 摘要:本论文旨在设计一款停车管理系统.本系统基于J2EE标准,采用B/S架 ...
- Hibernate+Spring+Struts2+ExtJS开发CRUD功能
http://blog.csdn.net/myloon/archive/2007/11/08/1873652.aspx-----多谢这么好的文章 Hibernate+Spring+Struts2+Ex ...
- session传递参数_分布式 Session 之 Spring Session 架构与设计
作者 | 李增光 杏仁后端工程师.「只有变秃,才能变强!」 前言 开始进行 Web 开发时,我们可能会遇到这样的情况,当服务器重启之后,之前的登录状态会失效需要重新登录.又或者你的应用程序部署了不止 ...
- Struts2+Hibernate+Spring 整合示例
转自:https://blog.csdn.net/tkd03072010/article/details/7468769 Struts2+Hibernate+Spring 整合示例 Spring整合S ...
最新文章
- CveService.java
- iOS学习之基本概念
- R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...
- 高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...
- 斯坦福CS224n追剧计划【大结局】:NLP和深度学习的未来
- java override 用法_Java中@Override的作用
- UI设计实用素材|线框套件 WRFRM
- Lua 正确的尾调用(proper tail call)
- Ubuntu启动密码丢失的找回
- Mac OS X 使用sshfs挂载Linux远程服务器磁盘
- C++,error c2662 cannot convert 'this' pointer from 'const A' to 'A '
- Ubuntu 18安装腾达u12 无线网卡驱动
- 软件测评师的一些重点①
- java 稀疏贝叶斯算法_稀疏贝叶斯学习(SparseBayesianLearning).PDF
- C++900行代码实现中国象棋游戏规则以及相关功能
- 2019年10月计算机系统结构答案,2019年计算机系统结构复习题.doc
- Tensorflow使用object_detetcion安装教程
- STM32——中断优先级分组
- 计算机面试专业英语词汇,面试常用英语,英语面试常用词汇?
- 性能:到底什么是性能测试
热门文章
- python selenium 进入新标签页_python 爬虫之selenium可视化爬虫
- lisp将图元追加选择_DNF:哈林防具和海博伦如何选择首饰提升率最大?你选对了吗?...
- Linux系统文件用户共享,Linux操作系统下的共享文件夹用户设定
- 虚拟机centos7.3不能启动
- Java讲课笔记29:Swing入门
- Going to 的将来时态_47
- 复数基础——例题_4
- java主动对象模式_POCO的主动对象
- 2017.9.30 物流运输 思考记录
- 每日小记2017.2.20