Struts2 ognl表达式调用方法不抛懒加载异常!!!
来源:互联网 发布:淘宝网企业店铺申请 编辑:程序博客网 时间:2024/05/29 19:14
今天点背,在用ssh2做oa项目时碰到一个诡异的bug!(这个struts2里面的异常竟然不抛出来!)
项目背景为:User类有属性Set<Role> roles, Role类有属性:Set<Privilege> privileges,
然后用户登陆后,在web的session中存放了user这个对象,并且在jsp页面中通过
<s:if test="#session.user.hasPrivilegeByName(privilegeName)">调用user的hasPrivilegeByName(privilegeName)方法
public class User{
......
public boolean isAdmin(){
return name.equals("admin");
}
//检测本用户是否拥有该权限
public boolean hasPrivilegeByName(String privilegeName){
//超级管理员拥有所有权限
if(isAdmin()){
return true;
}
for (Role role : roles) {//debug发现每次执行到这行代码就直接跳出了,这个hasPrivilegeByName方法就执行完毕了!!
for (Privilege privilege : role.getPrivileges()) {
if (privilegeName.equals(privilege.getName())) {
return true;
}
}
}
return false;
}
......
}
一脸懵逼!!什么情况,每次debug到for (Role role : roles)这一行,这个 hasPrivilegeByName方法就直接执行完毕了,没有任何异常信息!!
最后无意间我发现在Role.hbm.xml文件里
<set name="privileges" table="role_privilege" cascade="all" >
<key>
<column name="role_id"></column>
</key>
<many-to-many class="Privilege" column="privilege_id"></many-to-many>
</set>
没有配上lazy="false"
于是马上加上这个属性
然后功能就正常执行了!!!
----------------------------------------------------------------------------------------------------------------------
所以为什么代码执行到这一句直接跳出这个方法------------>是因为这里发生了懒加载异常!!
而且最恶心的是这个这个异常竟然没有在tomcat后台抛出来!!这真的是struts2的设计的一个小bug,给我们开发调试造成了很大的困扰!!
----------------------------------------------------------------------------------------------------------------------
至于为什么这里会发生懒加载异常,这里要说明一下!
尽管我在web.xml中配置了OpenSessionInViewFilter,但是
1)当我第一次请求,便从数据库中通过hibernate的session取出对应user对象,并且通过ActionContext.getContext().getSession().put("user",user)把 这个user对象保存到web层的session中,当这次的请求结束后,hibernate的事务结束,session也就在OpenSessionInViewFilter中关闭了,所以这个user对象便从持久化状态转为游离状态。
2)当再次请求时,因为会话没结束,程序仍可从web的session中取出那个游离的user对象,此时调用user.getRoles()、 role.getPrivileges() 自然而然会发生懒加载异常!!所以必须要配置lazy=“false”属性
- Struts2 ognl表达式调用方法不抛懒加载异常!!!
- 使用struts2中的ognl表达式调用类方法
- Struts2的OGNL调用公共静态方法
- struts2中OGNL无法调用静态方法
- struts2 ognl静态方法调用无效
- Struts2的OGNL调用公共静态方法
- Struts2的OGNL调用公共静态方法
- struts2的OGNL表达式
- struts2的OGNL表达式
- OGNL表达式struts2标签“%,#,$”
- struts2 OGNL表达式
- OGNL表达式struts2标签“%,#,$”
- Struts2中的OGNL表达式
- 再论 Struts2 OGNL表达式
- OGNL表达式struts2标签“%,#,$”
- OGNL表达式struts2标签“%,#,$”
- struts2 ognl 表达式
- OGNL表达式struts2标签“%,#,$”
- 每天一个linux命令:diff 命令
- Android ANR异常及解决方法
- Linux上的Shebang符号(#!)
- 深入解析Android中Handler消息机制
- Test
- Struts2 ognl表达式调用方法不抛懒加载异常!!!
- 使用 NGINX 流控和 fail2ban 防止 CC 攻击
- 静态库和动态库的使用
- Ubuntu16.04系统设置与优化方案
- 读写锁和两种同步方式的对比
- shell图形化菜单界面
- android webview上传文件
- Redis在win7上的可视化应用
- 每天一个linux命令:date命令