论坛首页 入门技术论坛

struts2+spring OpenSessionInViewFilter失效问题

浏览 12226 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-04-23  
问题已解决方法在10楼
刚刚配置成功了struts2+spring的一个例子 能够运行起来了 但是在jsp中迟缓加载数据时,发现session提前关闭了。 抛出
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
异常
在web.xml中的配置如下
<filter>
		<filter-name>openSessionInView</filter-name>
		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInView</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>

这个filter即使去掉 session也是会提前关闭 ,也就是说这个filter根本没起作用。

action中的代码如下
public class ProductAction extends ActionSupport {
	private ProductManager productManager;
	//结果
	private List recommendProducts; 

	@Override
	public String execute(){
		
		recommendProducts = productManager.findRecommendProduct();
		
		return SUCCESS;
	}
	
	public void setProductManager(ProductManager productManager) {
		this.productManager = productManager;
	}

	public List getRecommendProducts() {
		return recommendProducts;
	}
	
}


jsp中代码如下, recommendProduct 引用 product
<s:iterator value="recommendProducts" status="stuts">                
                <li><s:property value="product.productName"/></li> //迟缓加载 session此时已经关闭
                <li><s:property value="recommendId"/></li> //
</s:iterator>

不知道有没有人遇到这种情况?
   发表时间:2007-04-23  
这个老早就题出来过了,不是openSessionInView不起作用,而是出现了两套sessionFactory,用了各自的session,见:http://www.iteye.com/topic/15057
0 请登录后投票
   发表时间:2007-04-23  
janh 写道
这个老早就题出来过了,不是openSessionInView不起作用,而是出现了两套sessionFactory,用了各自的session,见:http://www.iteye.com/topic/15057

哥们能不能给出解决方法?
0 请登录后投票
   发表时间:2007-04-23  
解决方法就是不要在struts中配置spring的配置文件.
<plug-in 
className="org.springframework.web.struts.ContextLoaderPlugIn"> 
<set-property property="contextConfigLocation" 
value="/WEB-INF/applicationContext.xml,  
/WEB-INF/action-servlet.xml"/> 
</plug-in>

applicationContext.xml,  这个不要配置在struts plugin中
0 请登录后投票
   发表时间:2007-04-23  
dovecat 写道
解决方法就是不要在struts中配置spring的配置文件.
<plug-in 
className="org.springframework.web.struts.ContextLoaderPlugIn"> 
<set-property property="contextConfigLocation" 
value="/WEB-INF/applicationContext.xml,  
/WEB-INF/action-servlet.xml"/> 
</plug-in>

applicationContext.xml,  这个不要配置在struts plugin中

大哥 看清除题目 这是struts2 不是struts1.x

评新手贴的哥们 能不能给出解决方法呢?
0 请登录后投票
   发表时间:2007-05-13  
楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"
0 请登录后投票
   发表时间:2007-05-13  
movingboy 写道
楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"

问题是在延迟加载的时候 session已经close了
0 请登录后投票
   发表时间:2007-05-13  
xly_971223 写道
movingboy 写道
楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"

问题是在延迟加载的时候 session已经close了

我的意思就是“不要在使用many-to-one的同时使用延迟加载”
如果你没有试过我提到的办法,建议你试试;如果你已经试过了,那是我的猜测不正确,还得再想办法
0 请登录后投票
   发表时间:2007-05-13  
movingboy 写道
xly_971223 写道
movingboy 写道
楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"

问题是在延迟加载的时候 session已经close了

我的意思就是“不要在使用many-to-one的同时使用延迟加载”
如果你没有试过我提到的办法,建议你试试;如果你已经试过了,那是我的猜测不正确,还得再想办法

采用立即加载肯定不会出现这种情况
0 请登录后投票
   发表时间:2007-05-18  
终于找到问题所在了
今天为了解决这个问题单独建立了一个工程 ,先用spring+jsp进行lazy load ok没有问题
在web.xml上配置struts2
<?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">

		
	<!-- spring listener -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:resources/spring/applicationContext.xml</param-value>
	</context-param>
	
	<!--struts2-->
	<filter>
		<filter-name>struts</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- openSessionInView -->
	<filter>
		<filter-name>openSessionInView</filter-name>
		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInView</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>


然后配置上struts2 用struts2标签显示
<s:property value="order.orderId"/>
    <s:property value="order.receiverName"/>
    <s:property value="order.customer.customName"/>
    <s:property value="order.customer.nickname"/>

报session closed exception
而如下显示就没有问题
<body>
    This is my JSP page. <br>
    <%
    	WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
    	OrderManagerImpl orderManager = (OrderManagerImpl)wac.getBean("orderManager");
    	CustomOrder order = orderManager.findOrder(1L);
    	out.println(order.getReceiverPhone());
    	out.println(order.getCustomer().getCustomName());
    %>
  </body>

问题应该是在struts2这边了
将openSessionInView filter配置到struts2的FilterDispatcher前面试试
果然问题解决了 不会再出现session cl0sed exception
至于到底是什么原因 有时间再研究一下
给出正确的配置
<?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">

	<!-- openSessionInView 要配置在struts2的FilterDispatcher之前-->
	<filter>
		<filter-name>openSessionInView</filter-name>
		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInView</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- spring listener -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:resources/spring/applicationContext.xml</param-value>
	</context-param>
	
	<!--struts2-->
	<filter>
		<filter-name>struts</filter-name>
		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	
</web-app>
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics