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

Json-lib jQuery ext与 hibernate 共同使用死循环问题解决方案

报错

net.sf.json.JSONException: There is a cycle in the hierarchy!
	net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)
	net.sf.json.JSONObject._fromBean(JSONObject.java:833)
	net.sf.json.JSONObject.fromObject(JSONObject.java:168)
	net.sf.json.AbstractJSON._processValue(AbstractJSON.java:265)
	net.sf.json.JSONArray._processValue(JSONArray.java:2514)
	net.sf.json.JSONArray.processValue(JSONArray.java:2539)
	net.sf.json.JSONArray.addValue(JSONArray.java:2526)
	net.sf.json.JSONArray._fromCollection(JSONArray.java:1057)
	net.sf.json.JSONArray.fromObject(JSONArray.java:123)
	net.sf.json.AbstractJSON._processValue(AbstractJSON.java:237)
	net.sf.json.JSONObject._processValue(JSONObject.java:2808)
	net.sf.json.JSONObject.processValue(JSONObject.java:2874)
	net.sf.json.JSONObject.setInternal(JSONObject.java:2889)
	net.sf.json.JSONObject.setValue(JSONObject.java:1577)
	net.sf.json.JSONObject._fromBean(JSONObject.java:934)
	net.sf.json.JSONObject.fromObject(JSONObject.java:168)
	net.sf.json.AbstractJSON._processValue(AbstractJSON.java:265)
	net.sf.json.JSONObject._processValue(JSONObject.java:2808)
	net.sf.json.JSONObject.processValue(JSONObject.java:2874)
	net.sf.json.JSONObject.setInternal(JSONObject.java:2889)
	net.sf.json.JSONObject.setValue(JSONObject.java:1577)
	net.sf.json.JSONObject._fromBean(JSONObject.java:934)
	net.sf.json.JSONObject.fromObject(JSONObject.java:168)
	net.sf.json.AbstractJSON._processValue(AbstractJSON.java:265)

?

?

?

hibernate使用CGLIB把POJO的domain对象动态代理,实现它的魔法,但是给JSON的序列化带来了麻烦,因为JSON无法对lazy的属性进行序列化。有以下的四个方法可以解决hibernate的序列化问题

  1. domain类实现JSONString接口
  2. 建立JsonConfig实例,并配置属性排除列表
  3. 用属性过滤器
  4. 写一个自定义的JsonBeanProcessor

1. 实现JSONString接口是侵入性最强的方法

public class Person implements JSONString {
   private String name;
   private String lastname;
   private Address address;
 
   // getters & setters