`
pipe
  • 浏览: 206683 次
  • 性别: 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:{}

相关推荐

    简单的delegate实现

    @property (nonatomic, weak) id<SimpleDelegate> delegate; ... @end ``` 4. **处理事件**: 当事件发生时,比如按钮被点击,我们调用Delegate上的相应方法。在CustomButton的`- (void)touchesEnded:(NSSet*>...

    delegate一对多

    在Objective-C中,我们使用`@property`关键字声明属性,并通过`setter`和`getter`方法来设置和获取值。在Swift中,我们可以直接通过点语法`.property`来访问和修改属性。属性传值是对象间数据交换的基础,也是`...

    iOS学习笔记3---delegate五步曲,轻松学会使用delegate

    第二步:声明委托属性(Delegate Property) 在需要使用Delegate的类中(例如`WBComposeToolBar`),声明一个遵循该协议的委托属性。这通常是一个弱引用,以避免循环引用问题: ```objc @interface ...

    iOS Delegate传值通俗理解

    在iOS开发中,Delegate是一种非常重要的设计模式,用于对象间通信。它允许一个对象(委托者)通知另一个对象(委托对象)关于特定事件的发生。在iOS应用中,Delegate经常用于控制器间的通信,如UIViewController和...

    iPhone编程delegate示例

    在Objective-C中,`delegate`是一种关键的编程模式,用于实现对象间的通信。本文将深入探讨如何在iPhone编程中使用`delegate`,并以一个名为"MyDelegateSample"的示例项目来说明。 首先,`delegate`是Objective-C中...

    mybatis 分页拦截器及拦截器配置

    MyBatis 分页拦截器是实现数据库查询分页效果的一种高效解决方案。在传统的SQL查询中,我们通常需要手动编写分页语句,但这容易出错且不易维护。通过使用分页拦截器,我们可以将分页逻辑封装起来,使得在编写Mapper...

    OC中以delegate形式页面传值

    @property (nonatomic, weak) id<PageTransferDelegate> delegate; @end ``` 然后在`ViewControllerA.m`中,当需要传递值时,调用代理的方法: ```objc [self.delegate transferValue:@"传递的数据" fromSender:...

    Delegate 小Demo

    在.NET框架中,Delegate是事件处理和回调机制的关键组成部分,它代表了一组方法的签名,允许我们传递方法作为参数或创建方法的组合。这个“Delegate小Demo”显然是一个用于学习和复习Delegate用法的示例项目。让我们...

    C# Delegate小例子

    在这个"C# Delegate小例子"中,我们将深入探讨Delegate的概念、使用方式以及它在实际编程中的应用。 1. **Delegate概念**: Delegate在C#中是一种类,它代表对方法的引用。这种引用是类型安全的,意味着在编译时就...

    Delegate小Demo

    在.NET框架中,Delegate是类型安全的函数指针,它允许我们引用方法并像操作对象一样操作它们。Delegate是事件处理、回调函数和多播委托等核心编程概念的基础。在这个"Delegate小Demo"中,我们将深入理解Delegate的...

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    代理delegate_execute.exe

    delegate_execute.exe

    swift-多delegate的使用

    标签"Swift开发-其它杂项"表明这是一个关于Swift编程中非常规或特定场景的应用,而"PPSMutableDelegate-master"可能是指一个开源项目,该项目可能提供了更复杂或定制化的Delegate解决方案,例如支持动态添加和删除...

    delegate与block的使用

    在iOS和macOS的开发中,Delegate和Block是两种非常重要的设计模式,它们用于实现对象间的通信和回调机制。Delegate通常用于实现一对多的关系,而Block则提供了更加灵活的代码块传递方式。这两种机制在软件设计中都有...

    delegate的应用示例

    在.NET框架中,`Delegate`是一个非常重要的概念,它代表了一段可以被调用的代码,也就是一个方法的引用。`Delegate`是C#中的事件处理、回调机制以及多播委托的基础。本文件的"delegate的应用示例"显然是为了帮助...

    Delegate&Block作回调

    本示例主要探讨了两种回调方式:Delegate(代理)和Block(块)。这两种方式各有特点,开发者可以根据实际需求选择合适的实现方式。 首先,我们来详细了解一下Delegate。Delegate是一种协议(Protocol)导向的回调...

    C#使用委托(delegate)实现在两个form之间传递数据的方法

    在C#编程中,委托(Delegate)是一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种机制在处理事件处理和跨对象通信时非常有用,特别是在需要在多个Form之间传递...

    C# delegate thread范例

    委托(Delegate)则是C#中的一种类型,用于封装方法的引用,它可以看作是一种安全的多播函数指针。本篇将深入探讨如何在C#中使用委托和线程来实现异步编程。 首先,理解线程是非常重要的。在单线程应用程序中,所有...

    ios设计模式delegate

    ios设计模式delegate 示例 ,导航功能的两个视图控制器(用push方式从一个窗口推到另一个窗口),第二个窗口创建两个按钮,标题分别为红色和绿色,点相应的按钮弹回前一个窗口,同时前一个窗口的背影色变成按钮标题...

    C# Delegate讲解

    C# Delegate讲解 C# Delegate是.NET Framework中的一种重要机制,它允许开发者在程序中动态地调用方法。Delegate相当于函数指针,它指向程序中另一个以后会被调用的一个或多个方法。委托包含三个重要的信息:所调用...

Global site tag (gtag.js) - Google Analytics