`
pipe
  • 浏览: 205004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Property 'delegate' has no getter method 解决办法

阅读更多
我们使用json-lib包来用json转换hibernate持久化对象时候需要注意
如果持久化对象采用了延迟加载,或者持久化对象和另一持久化对象循环引用的时候,如何直接用
JSONArray jr = JSONArray.fromObject(Object);

这样的话 就会报错:java.lang.NoSuchMethodException: Property 'delegate' has no getter method

起初我被这个异常给迷惑了,以为就是简单的找不到 delegate变量的 getter方法。
实际上是由于采用了延迟加载或者循环引用引发的异常。
解决的办法如下:

新建两个类:HibernateJsonBeanProcessor和HibernateJsonBeanProcessorMatcher

HibernateJsonBeanProcessor代码如下:
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.*;

public class HibernateJsonBeanProcessor implements JsonBeanProcessor {
    public JSONObject processBean(Object obj, JsonConfig jsonConfig) {
	return new JSONObject();
    }
}


HibernateJsonBeanProcessorMatcher代码如下:
import net.sf.json.processors.*;
import java.util.Set;
import org.apache.log4j.Logger;

public class HibernateJsonBeanProcessorMatcher extends JsonBeanProcessorMatcher {
    private static Logger log = Logger
	    .getLogger(HibernateJsonBeanProcessorMatcher.class);

    @Override
    public Object getMatch(Class target, Set set) {

	if (target.getName().contains("$$EnhancerByCGLIB$$")) {
	    log.warn("Found Lazy-References in Hibernate object "
		    + target.getName());
	    return org.hibernate.proxy.HibernateProxy.class;
	}
	return DEFAULT.getMatch(target, set);
    }
}


这两个类完成之后,我们用json转换持久化对象就变成了这样:
JsonConfig conf = new JsonConfig();
		conf.registerJsonBeanProcessor(
			org.hibernate.proxy.HibernateProxy.class,
			new HibernateJsonBeanProcessor());
		conf.setJsonBeanProcessorMatcher(new HibernateJsonBeanProcessorMatcher());		
		JSONArray jr = JSONArray.fromObject(device, conf);		

这里这个device即为我们的持久化对象。

OK !经过这2步之后,程序运行正常!

分享到:
评论
2 楼 mengjiaoyao 2012-08-07  
mayanyun1986 写道
异常是不报了,但是输出为空!
public static String getJsonFromBean(Person bean) {
JsonConfig conf = new JsonConfig();
conf.registerJsonBeanProcessor(org.hibernate.proxy.HibernateProxy.class,
new HibernateJsonBeanProcessor());
conf.setJsonBeanProcessorMatcher(new HibernateJsonBeanProcessorMatcher());
JSONObject jr = JSONObject.fromObject(bean,conf);
System.out.println("jr:"+jr.toString());
return jr.toString();
}
输出为:
jr:{}

我的也是呀。。
1 楼 mayanyun1986 2009-08-10  
异常是不报了,但是输出为空!
public static String getJsonFromBean(Person bean) {
JsonConfig conf = new JsonConfig();
conf.registerJsonBeanProcessor(org.hibernate.proxy.HibernateProxy.class,
new HibernateJsonBeanProcessor());
conf.setJsonBeanProcessorMatcher(new HibernateJsonBeanProcessorMatcher());
JSONObject jr = JSONObject.fromObject(bean,conf);
System.out.println("jr:"+jr.toString());
return jr.toString();
}
输出为:
jr:{}

相关推荐

Global site tag (gtag.js) - Google Analytics