对象双向引用导致死循环
主要异常信息:There is a cycle in the hierarchy!
使用json-lib将Java对象转为json过程中,因为对象之间有相互引用关系,会发生死循环问题
以下三个实体的主要关系为:
Staff : Decidedzone <=> 1 : n <=>一个员工可以负责多个定区
Decidedzone : subarea <=> 1 : n <=>一个定区可以划分多个
子区域
Staff.java
public class Staff implements java.io.Serializable {
private String id;
private String name;
private String station;
private String standard;
private Set decidedzones = new HashSet(0);// 表示员工负责的多个定区(人为划分好的区域)
//下面省略...
}
Decidedzone.java
public class Decidedzone implements java.io.Serializable {
private String id;
private Staff staff; // 负责该定区的员工
private String name;
private Set subareas = new HashSet(0);// 定区下划分的子区域
//下面省略...
Subarea.java
public class Subarea implements java.io.Serializable {
private String id;
private Decidedzone decidedzone; // 子区域所属的分区
private String addresskey;
private String startnum;
private String endnum;
private String single;
private String position;
//下面省略...
解决方法(1):
第一种情况:页面不需要展示关联数据时,将关联数据排除即可。例如,需求为员工的列表页面不需要定区的信息。StaffAction.java中的转json的部分代码
JsonConfig config = new JsonConfig();
config.setExcludes(new String[]{"decidedzones"});
// 指定不需要的属性和一对多或者多对一的属性,避免出现循环问题
// Staff.java 中存在decidedzones属性,Decidedzone.java中存在staff属性
String json =
JSONObject.fromObject(staffList,config).toString();
//staffList为从数据库查询出来的集合对象
解决方法(2)
第二种情况:页面需要展示关联数据时,不仅要将关联数据排除,还要设置hibernate映射文件中的懒加载属性lazy=”false”。例如,需求为定区的列表页面不仅显示定区的信息,还需要显示负责该定区的员工信息,即多的一方需要显示一方的信息。DecidedzoneAction.java中的转json部分代码如下:
JsonConfig config = new JsonConfig();
config.setExcludes(new String[]{"subareas","decidedzones"});
// 指定不需要的属性和一对多或者多对一的属性,避免出现循环问题
String json =
JSONObject.fromObject(decidedzoneList,config).toString();
//decidedzoneList为从数据库查询出来的集合对象
hibernate映射文件配置
总结:json-lib不好用,建议使用gson或者jackson来转json