struts2异常:Struts Problem Report Struts has detected an unhandled exception: Messages: could not in


今天在写struts2 项目的时候,我一在jsp页面(有其他struts2标签,显示无误)中,一输入struts2的<s:debug></s:debug>标签,就出现了如下错误:(删掉这个标签后又正常使用)


严重: Servlet.service() for servlet jsp threw exception
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:164)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:285)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
    at com.chenruijia.ssh.entities.Department_$$_javassist_0.toString(Department_$$_javassist_0.java)
    at java.lang.String.valueOf(String.java:2827)
    at java.lang.StringBuffer.append(StringBuffer.java:219)
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
    at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93)
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    at freemarker.core.Expression.getStringValue(Expression.java:93)
    at freemarker.core.StringBuiltins$StringBuiltIn._getAsTemplateModel(StringBuiltins.java:71)
       ......



我就很纳闷了,一个struts2的标签怎么会影响到hibernate的session呢?


分析:

注意看上面的红色标记出来的内容(此时发现学好英语真的很重要!),仔细看,大概的意思是懒加载的问题吧,

意思是在session(hibernate里的session)关闭后使用employee对象的未加载变量,也就是说session已经关闭,然而该实例变量却还没有被初始化,就使用了该实例变量,导致该异常。


于是,我专门只查询

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这个异常的原因,看到了这篇文章  https://www.cnblogs.com/TTTTT/p/6682798.html(应该和我做的是同一个小项目),里面提到:


由于employee是由hibernate进行加载的,可能hibernate本身是以load的方式将该实例变量得到。此时在employeeDao里session获取到的是employee代理类对象,整个Session范围内,应用程序没有访问过employee对象,那么employee代理类的实例一直不会被初始话。事务是作用在EmployeeService上,导致
List<Employee> getAll( )方法调用之前获取Session、开启事务,这个方法结束之后提交事务、关闭session。session关闭后,在EmployeeAction获取employee时是未初始化的employee代理类对象,未被初始化的代理类对象只有OID其他属性全为null,那么放入request的Map里的是未被初始化的employee代理类对象。一旦在action或者jsp里要获取employee代理类对象,必然会发生懒加载异常。同理,在jsp里获取employee的department时同样存在懒加载的问题。
(关于hiberante的延迟加载,更详细的在原作者的另一篇博客里:http://www.cnblogs.com/TTTTT/p/6682304.html)

解决办法:

方法1.用openSessionInView 。
方法2.把这个类的延迟加载禁掉,lazy设为false。
方法3.迫切左外连接

但是,关键在于我已经使用了迫切左外连接(在前一个页面显示列表信息的时候已经遇到过这样的问题,在我的getList()方法中是使用了迫切左外连接:

//查询所有的员工信息
	public List<Employee> getAll(){
		//迫切左连接
		String hql = "FROM Employee e LEFT OUTER JOIN FETCH e.department";
		List<Employee> list = getSession().createQuery(hql).list();
		return list;
	}


然后我在希望去对应的修改页面上时,我使用了get(id)这个方法,在加上<s:debug>标签后才抛了这个异常。

//查询单个员工信息
    public Employee get(Integer id){
        return (Employee) getSession().get(Employee.class,id);
    }


于是,我在employee.hbm.xml文件中,尝试将其懒加载关掉。

<!-- 映射单向 n-1 的关联关系 -->
        <many-to-one name="department" class="com.chenruijia.ssh.entities.Department" lazy="false">
            <column name="DEPARTMENT_ID" />
        </many-to-one>
 
然后,问题解决了!!!

个人分析:

       确实,解决这种懒加载的问题确实是上面的三个方法,(对于方法2和3)老师推荐我们使用迫切左外连接而不是取消懒加载,但是如果需要根据不同的条件去写方法,每个都用迫切左外连接未免太麻烦。我想,在学习过程中,不需要懒加载的情况下也可以直接关闭懒加载,而更加方便,当然,以后实际开发可以用第一种方法或者其他的方法会更加科学。


最后,虽然问题解决了,但是对于之前 “<s:debug>标签就不行,删掉就好” 的问题,个人水平问题还是没法解决,可能是<s:debug>内部的机制要求的吧!希望有大神可以指点一下。



结束和声明

以上纯属个人观点和体会
希望这篇文章能对你有所帮助!
欢迎大家来一起讨论分享干货,或者批评指正!
更加热切盼望各路大神前辈给些指导和建议!

以后会不定期更新心得和总结,包括学习过程中各种异常和解决办法等等。再见!

转载请注明出处!或者联系我!(chenruijia_java@163.com)


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值