2019独角兽企业重金招聘Python工程师标准>>>

那么,为什么会出现这个异常呢?

究其原因,竟然是Hibernate的懒加载引起的。一定是你传递的数据中有引用类型的数据采用了懒加载机制。

比如:我要从Action中向前台传送一个Collection<Menuitem>,通过get方法

public Collection<Menuitem> getMenuitemList() {
  return this.menuitemList;
 }

而其中Menuitem类型的数据结构是:

public class Menuitem {
 private Long mid;
 private Long pid;//父节点
 private String name;//树的节点的名称
 private Boolean isParent;//是否为父节点
 private String icon;//图标的路径
 private Boolean checked;//复选框是否被选中
 /**
  * 菜单权限与用户是多对多的关系
  */
 private Set<User> users;

//getter(),setter()方法

}

在映射文件Menuitem.hbm.xml中users属性的配置如下:

<set name="users" table="user_menuitem" inverse="true">
         <key column="mid"></key>
         <many-to-many column="uid" class="cn.myoa.domain.User"></many-to-many>
</set>

未设置lazy="false",则默认采用懒加载模式。

当中间表user_menuitem中没有数据时,ok,不会牵涉到use表,也就不存在懒加载问题,运行一切正常。

但是当user_menuitem表中有数据,且数据与所传送的Menuitem对象有关时,就会有问题了

因为懒加载,这样在Action中获取的Menuitem对象中的users属性中的set集合中会存在user对象的引用,但是user的信息其实并未加载,

只有当用到时,容器才再次发出sql请求进行加载,但是在json插件对menuitemList进行处理以转换成json格式时,Hibernate Session早已关闭,这样user信息便加载不成功,而它又无法对set集合中空的引用进行处理,所以便抛出了JSONException。

有人可能会有疑问,我在web.xml中配置了OpenSessionInViewFilter过滤器,为什么Session还会关闭呢!?

这个疑问问的好!!我也不知何故,在网上也没找到相关的解释,不知是不是ajax的XMLHttpRequest的问题,

总之,在struts2与ajax结合的过程中,OpenSessionInView模式不起作用了!请知道的朋友不吝赐教!

好!既然知道了问题的原因,那么解决方法就很明了了!

方法一:设置lazy="false",即对user不采用懒加载。如

<set name="users" table="user_menuitem" inverse="true"lazy="false">
         <key column="mid"></key>
         <many-to-many column="uid" class="cn.myoa.domain.User"></many-to-many>
         </set>

不过这时要注意在User对象中有没有其他对象的引用,用过有,也要设置为非懒加载模式。

方法二:忽略set<User> users 属性,(推荐使用)

如果在前台页面不需要使用该属性的话,就不要把他传到前台去,设置方法是在其getter方法上加一注解: @JSON(serialize=false)

@JSON(serialize=false)
          public Set<User> getUsers() {
                  return users;
          }

这样json插件在转换数据时就会忽略该属性。

现在问题应该已经解决了!!

下面关于struts2和ajax的结合还有几点建议:

1、在页面用不到的数据最好不要传到前台(这也是之所以推荐第二种方法的原因,传的数据越大,效率越低不是吗!)

2、不是向前台传数据的方法最好不要以get开头,json插件会把所有get开头的方法当做属性,转为json格式数据

3、如果方法必须以get开头,然而又不是为了转为json格式,那么可以在该方法上加注解:@JSON(serialize=false)

4、需要传到前台的数据,一定要在dao中加载完毕,不能使用懒加载模式。

转载于:https://my.oschina.net/u/941420/blog/207445

struts2 传递json对象时的延迟加载异常处理方法相关推荐

  1. MVC中利用ViewBag传递Json数据时的前端处理方法

    ** MVC中利用ViewBag传递Json数据时的前端处理方法 ** 用viewBag传递Json字符串到前端时,json字符串中的"会被转义为& quot,前端处理方法为@Htm ...

  2. XE3随笔6:SuperObject 的 JSON 对象中还可以包含 方法

    SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: IS ...

  3. Struts2返回JSON对象的方法总结

    http://kingxss.iteye.com/blog/1622455 如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而 ...

  4. jQuery调用WCF服务传递JSON对象

    下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...

  5. ajax返回数据报406,ajax – 406返回JSON对象时出错 – 意外内容

    一些同事和我有一个问题,即ajax调用的响应返回一些意想不到的内容.而不是使用各种属性获取简单的 JSON对象,result.responseText的值是通用406状态错误页面的HTML标记,表示浏 ...

  6. 接口测试--apipost解决传递json参数时字符串包含有@和/的问题

    使用apipost进行接口测试的时候,传递json参数的时候字符穿中包含有@和/的时候就无法进行正常的访问. 是因apipost支持json参数使用内置mock字段,解决办法是在设置里面,把自动识别请 ...

  7. ajax传递json对象 php,PHP传递通过AJAX传递JSON对象数组到前台,前台解析,遍历JSON...

    PHP后台接网易接口 header("Content-Type:text/html;charset=utf-8"); //从文件读取数据 //$json_str =file_get ...

  8. json对象与字符串互转方法

    字符串转json对象: var data = eval( '(' + str + ')' ); json对象转字符串: var jsonStr = JSON.stringify( obj ); 转载于 ...

  9. json对象转换成string的方法

    jquery打印某个json对象的方法: <script> var jsonToString=typeof JSON !="undefined"? JSON.strin ...

  10. js对json对象的遍历和其他方法处理

    json的理解概要 字符串转成对象,对象转成字符串: JSON.parse( json) <===> JSON.stringify( json ) jQuery.parseJSON(jso ...

最新文章

  1. Tcpdump命令的使用与示例——linux下的网络分析
  2. 传海思砍台积电第三季度一半手机订单
  3. mysql自动挂载存储_Linux开机自动挂载存储
  4. html和css入门 (三)
  5. Ubuntu17.04安装WineQQ7.8及微信
  6. python列表添加元组_【Python爬虫】列表、元组、集合练习
  7. 免费的Installer 和 免费的Pascal Script Engine.
  8. 详谈Windows消息循环机制
  9. Cookie会话技术
  10. 【BZOJ3252】攻略【闵可夫斯基和】【堆启发式合并】
  11. mysql5.5 免编译安装及脚本启动报错深入
  12. 关于IOS数据解析的错误分析
  13. 组合数学 - 母函数的运用 + 模板 --- hdu : 2082
  14. 最新第一波:全国信息化工程师软考-系统集成项目管理工程师(高级案例高分论文)
  15. MATLAB怎么输入无穷小,matlab如何输入代码
  16. 查看电脑硬盘分区格式
  17. 体系切换,华为IPD的研发管理之道(上)
  18. 实例讲解新GRE填空的变化
  19. 计算机辅助翻译在翻译中的应用,计算机辅助翻译系统在翻译教学中的应用
  20. 鸡年关于鸡的一些歇后语

热门文章

  1. 怎么调用pda的打印机_win7系统如何更改打印机缓存文件夹 win7系统更改打印机缓存文件夹方法【介绍】...
  2. 海外市场鸿蒙系统,华为海外市场已恢复,鸿蒙系统首发应用在荣耀智慧屏,8月上市...
  3. 2-Linux C语言指针与内存-学习笔记
  4. 经典原型链、继承解析
  5. 物联网技术对于智慧生活24小时改变
  6. 这可能是有史以来最详细的JNI入门教程
  7. 【狂神说Redis】2Redis入门 2-3测试性能
  8. Unity UGUI优化:解决EventSystem耗时过长的问题 第一部分
  9. c语言 指针 地址溢出,堆栈溢出,指针在C中
  10. echart markline 设置不同颜色_小学信息技术《设置文档格式》教案