该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-23
刚刚配置成功了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> 不知道有没有人遇到这种情况? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-23
这个老早就题出来过了,不是openSessionInView不起作用,而是出现了两套sessionFactory,用了各自的session,见:http://www.iteye.com/topic/15057
|
|
返回顶楼 | |
发表时间:2007-04-23
janh 写道 这个老早就题出来过了,不是openSessionInView不起作用,而是出现了两套sessionFactory,用了各自的session,见:http://www.iteye.com/topic/15057
哥们能不能给出解决方法? |
|
返回顶楼 | |
发表时间: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中 |
|
返回顶楼 | |
发表时间: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 评新手贴的哥们 能不能给出解决方法呢? |
|
返回顶楼 | |
发表时间:2007-05-13
楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"
|
|
返回顶楼 | |
发表时间:2007-05-13
movingboy 写道 楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"
问题是在延迟加载的时候 session已经close了 |
|
返回顶楼 | |
发表时间:2007-05-13
xly_971223 写道 movingboy 写道 楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"
问题是在延迟加载的时候 session已经close了 我的意思就是“不要在使用many-to-one的同时使用延迟加载” 如果你没有试过我提到的办法,建议你试试;如果你已经试过了,那是我的猜测不正确,还得再想办法 |
|
返回顶楼 | |
发表时间:2007-05-13
movingboy 写道 xly_971223 写道 movingboy 写道 楼主是否在Hibernate的映射文件中设置了many-to-one关联?如果是,需要在该关联中设置lazy="false"
问题是在延迟加载的时候 session已经close了 我的意思就是“不要在使用many-to-one的同时使用延迟加载” 如果你没有试过我提到的办法,建议你试试;如果你已经试过了,那是我的猜测不正确,还得再想办法 采用立即加载肯定不会出现这种情况 |
|
返回顶楼 | |
发表时间: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> |
|
返回顶楼 | |