Property 'delegate' has no getter method

http://pipe.iteye.com/blog/224564

我们使用json-lib包来用json转换hibernate持久化对象时候需要注意
如果持久化对象采用了延迟加载,或者持久化对象和另一持久化对象循环引用的时候,如何直接用
Java代码 
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步之后,程序运行正常

你可能感兴趣的:(property)