我们使用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步之后,程序运行正常!
分享到:
相关推荐
@property (nonatomic, weak) id<SimpleDelegate> delegate; ... @end ``` 4. **处理事件**: 当事件发生时,比如按钮被点击,我们调用Delegate上的相应方法。在CustomButton的`- (void)touchesEnded:(NSSet*>...
在Objective-C中,我们使用`@property`关键字声明属性,并通过`setter`和`getter`方法来设置和获取值。在Swift中,我们可以直接通过点语法`.property`来访问和修改属性。属性传值是对象间数据交换的基础,也是`...
第二步:声明委托属性(Delegate Property) 在需要使用Delegate的类中(例如`WBComposeToolBar`),声明一个遵循该协议的委托属性。这通常是一个弱引用,以避免循环引用问题: ```objc @interface ...
在iOS开发中,Delegate是一种非常重要的设计模式,用于对象间通信。它允许一个对象(委托者)通知另一个对象(委托对象)关于特定事件的发生。在iOS应用中,Delegate经常用于控制器间的通信,如UIViewController和...
在Objective-C中,`delegate`是一种关键的编程模式,用于实现对象间的通信。本文将深入探讨如何在iPhone编程中使用`delegate`,并以一个名为"MyDelegateSample"的示例项目来说明。 首先,`delegate`是Objective-C中...
MyBatis 分页拦截器是实现数据库查询分页效果的一种高效解决方案。在传统的SQL查询中,我们通常需要手动编写分页语句,但这容易出错且不易维护。通过使用分页拦截器,我们可以将分页逻辑封装起来,使得在编写Mapper...
@property (nonatomic, weak) id<PageTransferDelegate> delegate; @end ``` 然后在`ViewControllerA.m`中,当需要传递值时,调用代理的方法: ```objc [self.delegate transferValue:@"传递的数据" fromSender:...
在.NET框架中,Delegate是事件处理和回调机制的关键组成部分,它代表了一组方法的签名,允许我们传递方法作为参数或创建方法的组合。这个“Delegate小Demo”显然是一个用于学习和复习Delegate用法的示例项目。让我们...
在这个"C# Delegate小例子"中,我们将深入探讨Delegate的概念、使用方式以及它在实际编程中的应用。 1. **Delegate概念**: Delegate在C#中是一种类,它代表对方法的引用。这种引用是类型安全的,意味着在编译时就...
在.NET框架中,Delegate是类型安全的函数指针,它允许我们引用方法并像操作对象一样操作它们。Delegate是事件处理、回调函数和多播委托等核心编程概念的基础。在这个"Delegate小Demo"中,我们将深入理解Delegate的...
网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...
delegate_execute.exe
标签"Swift开发-其它杂项"表明这是一个关于Swift编程中非常规或特定场景的应用,而"PPSMutableDelegate-master"可能是指一个开源项目,该项目可能提供了更复杂或定制化的Delegate解决方案,例如支持动态添加和删除...
在iOS和macOS的开发中,Delegate和Block是两种非常重要的设计模式,它们用于实现对象间的通信和回调机制。Delegate通常用于实现一对多的关系,而Block则提供了更加灵活的代码块传递方式。这两种机制在软件设计中都有...
在.NET框架中,`Delegate`是一个非常重要的概念,它代表了一段可以被调用的代码,也就是一个方法的引用。`Delegate`是C#中的事件处理、回调机制以及多播委托的基础。本文件的"delegate的应用示例"显然是为了帮助...
本示例主要探讨了两种回调方式:Delegate(代理)和Block(块)。这两种方式各有特点,开发者可以根据实际需求选择合适的实现方式。 首先,我们来详细了解一下Delegate。Delegate是一种协议(Protocol)导向的回调...
在C#编程中,委托(Delegate)是一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种机制在处理事件处理和跨对象通信时非常有用,特别是在需要在多个Form之间传递...
委托(Delegate)则是C#中的一种类型,用于封装方法的引用,它可以看作是一种安全的多播函数指针。本篇将深入探讨如何在C#中使用委托和线程来实现异步编程。 首先,理解线程是非常重要的。在单线程应用程序中,所有...
ios设计模式delegate 示例 ,导航功能的两个视图控制器(用push方式从一个窗口推到另一个窗口),第二个窗口创建两个按钮,标题分别为红色和绿色,点相应的按钮弹回前一个窗口,同时前一个窗口的背影色变成按钮标题...
C# Delegate讲解 C# Delegate是.NET Framework中的一种重要机制,它允许开发者在程序中动态地调用方法。Delegate相当于函数指针,它指向程序中另一个以后会被调用的一个或多个方法。委托包含三个重要的信息:所调用...