日期:2014-05-16  浏览次数:20322 次

关于使用ajax请求servletList转换Json抛的异常There is a cycle in the hierarchy!
    今天在完善自己做的网上书店的项目的时候,在查看书籍评论的时候准备使用ajax来操作(之前是直接页面全部刷新,感觉不爽,刚刚学了ajax,所以觉得ajax来弄),后台是用hibernate来操作数据库的。但是当写完代码测试的时候突然报错了。 如图

然后就百度 谷歌寻找解决方法,发现大多数都是说因为查询到的对象是放在list集合里面的,然后里面的对象是在数据库通过外键关联了的,也就是在对象模型中有多对一或者一对多等的关联关系,
这样查出来的list集合里面有关联的查出来就是一个对象而不是字符串或者数字,导致JSONArray.fromObject()的时候再内部出现死循环。最后证实确实也是这个原因造成的,然后网上大部分的解决方案都是说的是把有关联的对象的属性给去掉,就 /*过滤掉id属性*/
JsonConfig config1 = new JsonConfig();
         /*用数组的方式写出要过滤的东西*/
config1.setExcludes(new String[]{"user"});
JSONObject p1 = JSONObject.fromObject(review,config1);
第一个参数是放入你要转换的对象,list等.第二个参数放入JsonConfig 对象。
   自己想了些许过后发现这样的话如果你要查询的字段包括关联的对象里面的属性值呢?这样给它去除不转换以后你在界面上就取不到了。所以似乎不能满足我的要求。
    最后自己觉得可以在为数据库表写一个javabean,里面不用对象关联,就如使用jdbc的时候的那样,

然后把从数据库里面读出来的数据list遍历后把值全部取出来并一一赋值给新创建的这个javabean对象,在重新 new一个list,用来装改变后的对象。这样最后再用JSONArray.formObject(list),放入新建的list集合,这样转换就可以成功了。如图成功了没报错。

当然这个方法对于我来说已经可以了,毕竟还是新手,主要是问题能解决就ok了,不知道以后在strut里面是否有改进?自己现在刚刚学完javaweb,然后hibernate都是自学的,ajax刚刚学完,所以大神些看到这个的话就不要说是你这个根本不叫解决了。