先看2个类,Region中的subareas,Subarea中的region相互关联。
/**
* 区域
*/
public class Region implements java.io.Serializable {
// Fields
private Set subareas = new HashSet(0);
public Set getSubareas() {
return this.subareas;
}
public void setSubareas(Set subareas) {
this.subareas = subareas;
}
}
/**
* 分区
*/
public class Subarea implements java.io.Serializable {
// Fields
private Region region;
public Region getRegion() {
return this.region;
}
public void setRegion(Region region) {
this.region = region;
}
}
以Region为例,当转换为json时,它的subareas属性也会转换,而Subarea中又有region属性,这样就陷入了死循环。
解决方法:
第一种情况(不需要subareas中的数据)
在转json的时候可以直接将subareas属性去掉,不转换这个属性即可
我是采用的JSON-lib
JsonConfig jsonConfig = new JsonConfig();
// 指定哪些属性不需要转json
jsonConfig.setExcludes(new String[]{"subareas"});
String json = JSONObject.fromObject(region,jsonConfig).toString();
第二种情况,需要subareas中的数据
此时可以只排除Subarea中的region属性即可,
只需要写属性名,不需要写成XXX.region
JsonConfig jsonConfig = new JsonConfig();
// 指定哪些属性不需要转json
jsonConfig.setExcludes(new String[]{"region"});
String json = JSONObject.fromObject(region,jsonConfig).toString();
在使用hibernate时
即使排除了region属性,仍然会出现死循环。
由于hibernate默认使用了懒加载,所以subareas中的值不会立即查出来,当在转换json之前,它只是一个代理对象,而在进行转换时,它并不会触发hibernate去加载他们,因此,此时转换的是那个代理对象,而这个代理对象中的某些属性,同样造成了死循环。
解决方法当然就是关掉 subareas的懒加载