OpenSessionInViewFilter在struts2中失效的问题

huafenghua 2008-03-14 11:43:16
使用struts2+hibernate3+spring2.5开发应用,用spring的getHibernateTemplate()的托管Hibernate应用。
在web.xml中配置了OpenSessionInViewFilter的过滤器,但是如果在struts2的action中实现级联加载的时候,总返回session is closed的错误信息,此错误,考虑是过滤器没有起到作用的原因。
在网上查了相关的资料,有JavaEye网站Robbin的解决方案,但那是针对struts1.x的,也有是web.xml中过滤器的配置顺序引起的(试验了,还是不起作用)。
请问哪位遇到同类型的问题?有相应的解决方案吗?或者造成此问题的缘由是否也是类似struts1.x?
期待各位的解答,如果可以,请加我QQ:3643851,当面请教,非常感谢。

附:我的web.xml的配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>pm5</display-name>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/*.xml</param-value>
</context-param>
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter>
<filter-name>struts2-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>



...全文
826 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huafenghua 2008-03-17
  • 打赏
  • 举报
回复
另外,还有个网上经常碰到的问题,想请问下
现在配置了这个filter后,对Update和delete等的操作,出现这个异常
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

网上的解决方案是在spring的配置文件中设置事务,您能把您的配置贴出来吗,针对所有以*Service类型类的事务设置

另外,我自己在Service里面用TranscationTemplate,实现了一些编程式的事务处理。和配置文件中的事务处理有冲突吗?
期待您的回复。
sunyujia 2008-03-16
  • 打赏
  • 举报
回复
如果你配置文件配对了,我推测是这个原因


spring不在一个上下文环境里面,你要保证你的应用spring上下文环境只有一个,你不应该使用ClassPathXmlApplicationContext,你应该从web上下文中取的spring上下文环境
huafenghua 2008-03-16
  • 打赏
  • 举报
回复
想请问一下,这个问题与我action的开发方式有问题吗?我的开发方式如下:
ActionSupport
AbstracAction
MyOwnLogicAction
AbstracAction继承ActionSupport,里面进行相应的一些日志和权限判断处理,MyOwnLogicAction继承AbstracAction,进行我相应的业务逻辑处理。我的Service的获得,都是通过
new ClassPathXmlApplicationContext(configName).getBean("beanName")的方式里获得的

请问这样子有影响吗????
多谢
huafenghua 2008-03-16
  • 打赏
  • 举报
回复
对1,按照您的说法,strtus2的那个spring插件主要做什么用的呢?
sunyujia 2008-03-16
  • 打赏
  • 举报
回复
1.如果你不在spring配置struts的action bean那么这个bean就不被spring托管了,就是不单例,(到底是不是单例跟配置文件配置有关,托管了也可以不是单例)
2.单例的bean性能略优于非单例的bean
huafenghua 2008-03-16
  • 打赏
  • 举报
回复
非常感谢您的回复,这个问题已经解决了。
另外,有几个问题想请教您一下:

1、在action中调用service的时候,如果我不在spring的配置文件中配置action这个bean,那他这个action是不是通过
struts2的spring插件初始化的?是singleton类型的吗?
2、所有的bean,默认的都是singleton模式的,这个对性能会有影响吗?

期待您的回复。
huafenghua 2008-03-16
  • 打赏
  • 举报
回复
嗯,您的这个提醒了我,我试下看看。
sunyujia 2008-03-15
  • 打赏
  • 举报
回复
对不起发错了刚才那个是前年写的小东西

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- *************************************************************************start******** -->
<display-name>demo</display-name>
<!-- **********************************************************************context-param*********** -->
<!--spring配置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:appContext*.xml</param-value>
</context-param>
<!-- ***********************************************************************listener********** -->
<!--spring配置-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- **********************************************************************filter*********** -->
<!-- 中文过滤器 -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.syj.util.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<!-- hibernate3 OpenSessionInView 模式 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>
com.syj.util.OpenSessionInViewFilter
</filter-class>
</filter>
<!--struct配置 -->
<filter>
<filter-name>Struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<!-- **********************************************************************filter-mapping*********** -->
<!-- 中文过滤器 -->
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- hibernate3 OpenSessionInView 模式 注意:一定配置struct mapping的前面-->
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!--struct配置 注意:一定配置OpenSessionInView mapping的后面-->
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ************************************************************************servlet********* -->
<!-- 负责系统初始化的启动Servlet -->
<servlet>
<servlet-name>initServlet</servlet-name>
<servlet-class>com.syj.action.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置图形码 -->
<servlet>
<servlet-name>codeFact</servlet-name>
<servlet-class>com.syj.util.CodeFact</servlet-class>
</servlet>
<!-- jfreechart显示图表 -->
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>
org.jfree.chart.servlet.DisplayChart
</servlet-class>
</servlet>
<!-- ************************************************************************servlet-mapping********* -->
<!-- 负责系统初始化的启动Servlet -->
<servlet-mapping>
<servlet-name>initServlet</servlet-name>
<url-pattern>/initServlet</url-pattern>
</servlet-mapping>
<!-- 配置图形码 -->
<servlet-mapping>
<servlet-name>codeFact</servlet-name>
<url-pattern>/codeFact</url-pattern>
</servlet-mapping>
<!-- jfreechart显示图表 -->
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
<!-- *************************************************************************jsp-config******** -->
<jsp-config>
<!--syj标签库配置-->
<taglib>
<taglib-uri>syj.tld</taglib-uri>
<taglib-location>/WEB-INF/syj.tld</taglib-location>
</taglib>
</jsp-config>
<!-- *************************************************************************end******** -->
</web-app>

sunyujia 2008-03-15
  • 打赏
  • 举报
回复
OpenSessionInViewFilter作用就是在调用你写的代码前绑定session,只要保证它早于你的struts Action执行就可以了,
去年使用struts2,spring2,hibernate3写的小东西的配置你看下吧,顺序问题

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>corpweb</display-name>
<filter>
<filter-name>setcharacterencodingfilter</filter-name>
<filter-class>com.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setcharacterencodingfilter</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
<listener>
<listener-class>com.listener.OnlineStatisticListener</listener-class>
</listener>
<servlet>
<servlet-name>initservlet</servlet-name>
<servlet-class>com.init.InitServlet</servlet-class>
<init-param>
<param-name>configFile</param-name>
<param-value>/WEB-INF/configfiles/configFile.xml</param-value>
</init-param>
<init-param>
<param-name>proxool</param-name>
<param-value>/WEB-INF/configfiles/proxool.xml</param-value>
</init-param>
<init-param>
<param-name>hibernateCfg</param-name>
<param-value>/WEB-INF/configfiles/hibernate.cfg.xml</param-value>
</init-param>
<init-param>
<param-name>log4jConfigFile</param-name>
<param-value>/WEB-INF/configfiles/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>imagecaptchaservlet</servlet-name>
<servlet-class>com.util.ImageCaptchaServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>codefact</servlet-name>
<servlet-class>com.util.CodeFact</servlet-class>
</servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/configfiles/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/infopub</param-name>
<param-value>/WEB-INF/configfiles/struts-infopub.xml</param-value>
</init-param>
<init-param>
<param-name>config/guestbook</param-name>
<param-value>/WEB-INF/configfiles/struts-guestbook.xml</param-value>
</init-param>
<init-param>
<param-name>config/employ</param-name>
<param-value>/WEB-INF/configfiles/struts-employ.xml</param-value>
</init-param>
<init-param>
<param-name>config/forum</param-name>
<param-value>/WEB-INF/configfiles/struts-forum.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>proxool</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>Connector</servlet-name>
<servlet-class>com.fredck.FCKeditor.connector.ConnectorServlet</servlet-class>
<init-param>
<param-name>baseDir</param-name>
<param-value>/UploadFiles/</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet>
<servlet-name>SimpleUploader</servlet-name>
<servlet-class>com.fredck.FCKeditor.uploader.SimpleUploaderServlet</servlet-class>
<init-param>
<param-name>baseDir</param-name>
<param-value>/UploadFiles/</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>enabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsFile</param-name>
<param-value/>
</init-param>
<init-param>
<param-name>DeniedExtensionsFile</param-name>
<param-value>php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi</param-value>
</init-param>
<init-param>
<param-name>AllowedExtensionsImage</param-name>
<param-value>jpg|gif|jpeg|png|bmp</param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsImage</param-name>
<param-value/>
</init-param>
<init-param>
<param-name>AllowedExtensionsFlash</param-name>
<param-value>swf|fla</param-value>
</init-param>
<init-param>
<param-name>DeniedExtensionsFlash</param-name>
<param-value/>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet>
<servlet-name>DownLoad</servlet-name>
<servlet-class>com.util.DownLoad</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Connector</servlet-name>
<url-pattern>/FCKeditor_SYJ/editor/filemanager/browser/default/connectors/jsp/connector</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SimpleUploader</servlet-name>
<url-pattern>/FCKeditor_SYJ/editor/filemanager/upload/simpleuploader</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>codefact</servlet-name>
<url-pattern>/codefact</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>imagecaptchaservlet</servlet-name>
<url-pattern>/imgCodeStr</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>proxool</servlet-name>
<url-pattern>/Admin/viewProxool</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>initservlet</servlet-name>
<url-pattern>/initservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DownLoad</servlet-name>
<url-pattern>/forum/servlet/DownLoad</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>20</session-timeout>
</session-config>
<taglib>
<taglib-uri>/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-tiles.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/struts-nested.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-nested.tld</taglib-location>
</taglib>
<resource-ref>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>


临远 2008-03-14
  • 打赏
  • 举报
回复
看着没问题啊,只要把osiv写到struts2的filter前就可以了。

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧