jfinal我用阿里的fastJson,打印分页查询的结果会出现死循环。

1、我用阿里的fastJson,打印分页查询的结果会出现死循环。

用Gson和JsonKit,都不会,不知道为什么。请试试。

blob.png

评论区

JFinal

2016-08-16 23:31

从两个方向检查一下:
1:Goods 这个类里面有没有 getter 方法是再次查询了数据库的
2:Goods 内部的对象有无循环关联
总的来说,造成这个错误的原因是被转换的对象之间出现了循环依赖,尤其是上述1中的getter 方法读库,并且依赖关系藏在数据中
上述2中的可能性小些,因为 fastjson 应该对内存中的依赖可以自动处理好

JFinal

2016-08-16 23:33

JsonKit 之所以不会出现这个问题,有两个原因:
1:JsonKit 转换json 时不会调用 model 的 getter 方法,所以 getter 方法中如果存在数据库操作也不会被触发
2:JsonKit 中有 convertDept 变量能在出现循环依赖时跳出转换

韦甩甩

2016-08-17 10:37

@JFinal 我发现的一个线索是,我的分页代码是常规的select * from goods,他的分页代码是JSON.toJSONString(Goods.dao.paginate(1, 10,"select * ","from goods"));我把这行代码,随便放在login的controller里,然后调试,并且,我在Goods.java,也就是他的model类里,写了另外一个函数,public List getXXxGoodsList(){}方法里面也就写了个select 返回list的代码,我测试发现,只要是方法以get开头,fastJson,就是自动循环调用,Goods.java里的这个getXXxGoodsList函数,里面的SQL代码。我不解的是,我明明让执行的是select * from goods,为啥,跑到goods.java里面执行和它无关的getXXxGoodsList()函数。我在Goods.java里,不出现以get开头的函数,就不会出现死循环。应该是第1个原因,我的goods.java里,有getter函数,里面查询了数据,而且也是返回List,应该是递归了。3Q。看来开发还是,不用fastJson

JFinal

2016-08-17 11:20

@韦甩甩 fastjson 转 json 时,会对所有的 getter 方法进行处理,会将这些 getter 方法的返回值进行转换,这里的 getter 是指 public Type getXxxx() 这种 public 无参 get 方法,如果有参则不是 getter,这个是 java bean 规范

v5js

2016-09-03 23:39

我也碰到过这种问题,想想就恐怖,非得把线上库搞死不可

热门反馈

扫码入社