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

本文介绍如何使用json-lib包处理Hibernate持久化对象的JSON转换,特别是解决延迟加载和循环引用导致的问题。通过自定义HibernateJsonBeanProcessor和HibernateJsonBeanProcessorMatcher类实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们使用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步之后,程序运行正常!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值