有很多同学在用使用flex+hibernate做应用开发时都会出现由延迟加载导致的异常:Could not initialize proxy…………….
笔者在使用ibatis2.x做持久层时,也遇到这个问题,究其原因,在于blazeds无法正常序列化Java端返回的代理类。
而hibernate默认会对类属性和集合属性返回代理,在大多数情况下这都是很合理的,即使要在web端访问代理属性,也可以采用openSessionInView模式,将session延伸到web层。但是flex的客户端比较特殊,不宜采取这种做法。针对这个问题,有一些开源的解决方案:dpHibernate,Glead等,但笔者感觉这些框架侵入性太强,不宜采用。
在不引入第三方框架的情况下,可以采取两个办法:1.增加一层Vo类,将类属性和集合属性的代理进行转化,然后与as映射,传给flex端 ,这样序列化是ok的。
2.采用Spring 的aop解决方案,对可能返回无法正常序列化的pojo方法进行拦截。步骤如下:
1.开启@AspectJ
<aop:aspectj-autoproxy/>
2.编写针对具有代理属性类的转化工具类:假如Student类具有多对一的类属性Grade:
public class Student {
private Long id;
private Grade grade;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
用代码生成器生成StudentConvert.java :
public class StudentConverter {
public static Student convert2Student(Object sourceObj) {
Student source=(Student) sourceObj;
Student target = new Student();
target.setId(source.getId());
//Hibernate.initialize(source.getGrade()); 可以选择将类或集合代理初始化
//target.setGrade(source.getGrade());
return target;
}
public static List convert2StudentList(List oldlist) {
List newlist= new ArrayList();
for(Object sourceObj : oldlist) {
newlist.add(convert2Student(sourceObj));
}
return newlist;
}
}
3.编写aop的advisor进行环绕通知,假设StudentDao 有两个方法
Student findById(Long id)
List findAll();
由代码生成器生成对应的advisor如下 HibernateAdvisor.java :
@Aspect
public class HibernateAdvisor {
//insert aop code for hibernate
///////////////////////////
// Student readme
///////////////////////////
/**
* 必须为final String类型的,注解里要使用的变量只能是静态常量类型的
*/
// 切入点定义
public static final String StudentList = "execution(* com.lai.flex.service.StudentDao.findAll(..))";
public static final String Student = "execution(* com.lai.flex.service.StudentDao.findBy*(..))";
@Around(StudentList)
public List convertStudentList(ProceedingJoinPoint joinPoint) {
//System.out.println("Convert之前");
Object[] args = joinPoint.getArgs();
Object obj = null;
List newlist= null;
try {
obj = joinPoint.proceed(args);
List old= (List) obj;
newlist=(StudentConverter.convert2StudentList(oldlist));
} catch (Throwable e) {
e.printStackTrace();
}
//System.out.println("Convert之后"); // 方法执行后的代理处理
return newlist;
}
@Around(Student)
public Student convertStudent(ProceedingJoinPoint joinPoint) {
//System.out.println("Convert之前");
Object[] args = joinPoint.getArgs();
Object obj = null;
Student newsStudent = null;
try {
obj = joinPoint.proceed(args);
newsStudent = StudentConverter.convert2Student(obj);
} catch (Throwable e) {
e.printStackTrace();
}
//System.out.println("Convert之后"); // 方法执行后的代理处理
return newsStudent;
}
// generator-insert-location
}
最后,由StudentDao方法返回的代理类和集合属性在序列化到flex端之前,都被拦截,进行转化后,可以正常序列化了。
声明:如需转载,请注明作者-hhlai1990@gmail.com
欢迎大家使用rapid-framework快速开发框架以及rapid-generator代码生成器
http://code.google.com/p/rapid-framework
分享到:
相关推荐
### Flex延迟加载问题说明处理实现 #### 一、引言 在现代Web开发中,为了提升用户体验和系统性能,开发者常常采用各种优化技术。其中,延迟加载(Lazy Loading)是一种非常实用的技术,它允许资源(如图片、脚本等...
本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...
编译并运行你的Flex应用,检查地图是否正确加载和显示,同时解决可能出现的错误和警告。 通过以上步骤,你可以成功地在ArcGIS for Flex应用中加载高德地图。这个过程涉及到的地图服务集成、自定义图层创建以及Flex...
"Flex动态加载CSS实例"就是一个这样的实践,它旨在解决在运行时按需加载CSS的问题,从而提高页面加载速度并降低初始加载时的带宽消耗。 Flex在这里可能指的是使用Flex布局(Flexible Box Layout),这是一种现代的...
"flex加载大图片等待特效"这一主题就是针对这个问题提出的一种解决方案,它旨在提供一种优雅的方式,在图片加载期间展示等待效果,以提升用户体验。 Flex布局是CSS3中的一种布局模式,它允许容器中的子元素在行或列...
博客文章"关于flex与flash生成swf文件的加载(体积)问题"可能详细讨论了以上某些方法,并提供了具体实现的示例或工具。通过阅读该文章,开发者可以获得更深入的理解和实用技巧,以解决实际开发中的SWF文件加载问题...
可以考虑使用像素缓冲区、异步加载和解码、预加载部分帧等方法提高性能。 8. **兼容性与跨平台**:在Flex应用中使用GIF动画时,要考虑不同浏览器和操作系统对GIF的支持情况。虽然大部分现代环境都支持GIF,但在一些...
在Flex环境中,由于其默认不支持GIF格式的动态显示,因此需要额外的解决方案来处理这类图像。本组件就是为了解决这个问题而诞生的。 1. **Flex环境与GIF显示** - Flex是基于ActionScript 3.0的开放源码框架,主要...
可能的解决方案可能包括: 1. **按需加载**:仅在需要显示特定数据项时才创建对应的ItemRenderer,而不是一次性加载所有。 2. **缓存策略**:对于已创建但不再显示的ItemRenderer,可以将其缓存起来,以便再次需要...
在Flex中,分页组件通常是自定义组件,因为Flex的标准库并未提供内置的分页解决方案。开发者通常需要根据实际需求来设计和实现这样的组件。以下是对Flex分页组件的详细解释: 1. **分页机制**:分页的核心是将大...
本文将深入探讨Flex3中的客户端缓存策略,以及如何利用Module解决方案来有效地管理SWF文件缓存。 首先,让我们了解什么是Flex。Flex是由Adobe开发的一种开源框架,用于构建富互联网应用程序(RIA)。它主要基于...
总之,Flex VideoPlayer(FXVideo)是一个强大的、开源的视频播放解决方案,它提供了一系列完善的控制功能,适合各种Web应用程序中的视频播放需求。其开源特性不仅鼓励了社区的创新与改进,也为开发者提供了深入学习...
【Flex瘦身优化】是针对Flex开发中遇到的项目体积过大的问题进行的一系列优化措施,主要是为了减小Flex应用程序的发布体积,提高加载速度和用户体验。以下是一套可行的优化方案: 1. **关闭编译调试信息**: 添加`...
FlexMDI可能包含一些方法来缓存窗口实例或延迟加载,以提高应用程序的响应速度和效率。 8. **版本控制**:文件列表中提到的是flexmdi-1.1版本,这可能意味着这是一个早期版本,可能不包含最新功能或者可能存在已知...
在Flex与Java BlazDS集成的过程中,了解并掌握这些常见问题的解决方案可以帮助开发者更高效地构建和调试应用程序。BlazeDS作为数据传输服务,提供了AMF(Action Message Format)协议,使得Flex前端和Java后端之间的...
这个源码包提供了一个完整的解决方案,不仅包含了甘特图的前端展示代码,还附带有后端服务和数据库支持,使得开发者能够快速构建出一个功能完备的项目管理应用。 在Flex Gantt中,主要的知识点包括: 1. **Flex...
总的来说,这个Flex3项目提供了一种动态展示Logo的解决方案,利用了Flex的组件、XML数据绑定和动画效果,使得首页Logo的更新和定制变得简单且灵活。对于前端开发者来说,理解和掌握这种技术可以帮助他们快速构建具有...
### Maven构建全栈式Flex、BlazeDS和Spring集成解决方案:第二部分——编写to-do_list服务器端 在深入探讨如何构建一个集成了Flex、BlazeDS和Spring的全栈式解决方案之前,让我们先简要回顾一下这个系列文章的背景...
解决方法是使用ObjectProxy类,它可以充当IEventDispatcher,从而允许在任何对象上进行数据绑定。 ### 8. MVC架构中,AS3时是写在MXML还是AS文件中? 在Flex中,MVC架构被广泛采用,其中MXML用于定义视图,而...
综上所述,Flex软键盘是一个综合运用Flex组件化开发、事件处理、自定义布局等技术实现的触摸屏输入工具,它为开发者提供了一个可扩展、可定制的解决方案,适应各种触摸设备的输入需求。通过深入理解其工作原理和源...