`
fandayrockworld
  • 浏览: 313021 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用BlazeDS实现java与flex传对象时,RemoteClass中包含自己写的类,后台无法转换的问题

    博客分类:
  • Flex
阅读更多

环境:BlazeDS 3.0.0.544

 

BlazeDS很好的帮助我们实现java对象和Flex对象的相互转化,减少了我们的硬编程量,很方便。

但是最近遇到一个问题,描述如下:

 

java 中有两个类,其中一个类中有一个变量是另一个类的类型,如下:

public class MyClass {// 假设此类在com.test.a中
        private InnerMyClass inclass;
        private String name;

        // ... getters and setters
}

public class InnerMyClass {// 假设此类在com.test.b中
        private String aValue;

        // ... getters and setters
}

 

这样,如果想通过BlazeDS实现Flex和java的对象传递,必须在Flex中同样写两个类:

// 假设两个类不在一个包中
package a.vo{
	[Bindable]
    [RemoteClass(alias="com.test.a.MyClass")]
	public class MyClass {
			private InnerMyClass inclass;
			private String name;

			// ... getters and setters
	}
	// ...
}

package b.vo{
	[Bindable]
    [RemoteClass(alias="com.test.b.InnerMyClass")]
	public class InnerMyClass {
			private String aValue;

			// ... getters and setters
	}
	// ...
}

 

但是,这样写编译器就会报错了,很简单,原因是MyClass没有引入InnerMyClass,为了不报错,我们通常情况下会这么做:

修改MyClass为:

package a.vo{
	[Bindable]
    [RemoteClass(alias="com.test.a.MyClass")]
	import b.vo.InnerMyClass;// 加了这句话
	public class MyClass {
			private InnerMyClass inclass;
			private String name;

			// ... getters and setters
	}
	// ...
}
 

这样我们就向后台传值,但是后台取到的是什么对象呢?

是不是MyClass呢?

-- 很遗憾的告诉大家,不是。

那是什么呢?

-- HashMap。

为什么会是这样呢?

-- 这个请参阅BlazeDS的官方文档。

我们应该怎么做才能让后台取到的是一个MyClass对象呢?

-- 像下面似的把MyClass改为:

package a.vo{
	[Bindable]
    [RemoteClass(alias="com.test.a.MyClass")]
	// import b.vo.InnerMyClass;// 去掉这句话
	public class MyClass {
			private b.vo.InnerMyClass inclass; // 在此处加上对InnerMyClass 的引用
			private String name;

			// ... getters and setters
	}
	// ...
}
 

这样java端就能取到MyClass的对象了。

 

至于为什么加上import就取不到MyClass对象,这个我还没研究出来,期待大家探讨。

 

 

分享到:
评论
9 楼 fandayrockworld 2013-05-15  
liuloveyun 写道
请教lz啊,我的不行,纠结死了,第一次使用java与flex结合的,但是我对数据库添加数据的时候出错的
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'Depid' cannot be null

报的这个错跟这篇文章没关系,是因为depid这个字段在数据库里不能为空
8 楼 liuloveyun 2013-05-14  
请教lz啊,我的不行,纠结死了,第一次使用java与flex结合的,但是我对数据库添加数据的时候出错的
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'Depid' cannot be null
7 楼 whao189 2011-04-28  
楼主分析很不错。。我做开发的时候倒是没有关注这个事情。。。

现在想想。。还真觉得 应该看看这个东西。。。期待楼主 更好的分析。。

6 楼 xlightningx 2011-04-19  
嗯,我会试一试,刚在论坛上看到一个类似spring的flex端框架,能够实现IOC,目前正在学习.估计这个能解决你最开始提出的类互相引用的问题.
5 楼 fandayrockworld 2011-04-18  
xlightningx 写道
fandayrockworld 写道
xlightningx 写道
估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.

为什么要在flex端重新声明一遍对象?
>主要是为了编程方便(引入之后直接“点”就出来属性、方法了)和增加可维护性(属性一眼就能看出来是哪个,比hashmap的方式可维护性高吧)。

非要用到对象的话,我会用spring。
>我没大搞明白你说的是什么意思,flex端重新写类跟用不用spring没什么关系吧。



其实还是习惯问题,虽然FLex是Ria,但我还是习惯让它只显示控件而不承担具体的业务逻辑,也就是说一般不会在Flex端做类去封装.

我现在用spring-flex-1.5.0.M2,flex客户端只放控件,所需的数据和业务逻辑等都是通过RemoteObject交到java端去处理.

java端应建立PictureLogic层来接收Flex的界面请求,然后交由BusinessLogic层来处理业务规则,此后会调用到Dao层去访问数据库,当然你也可以加入Hibernate(好像lazyload会有问题,没试过),最终把获得的结果通过BlazeDS传回flex客户端.
而我习惯使用spring的JdbcTemplate类的queryForMap方法来传递数据到Flex端,这样传递的是HashMap格式的数据,非常便于Flex控件来显示.

嗯,的确是习惯问题,感觉程序员都不大喜欢改变。但是,这样会麻痹自己,用自己现有所掌握的知识做着重复劳动。
建议楼上最好试一下这个直接传类的方式,你会爱上它的(特别是用hibernate的时候,你说的lazyload的问题我真没碰到)。
不然的话这和传统的非ria没两样了,优势真体现不出来。
4 楼 xlightningx 2011-04-18  
fandayrockworld 写道
xlightningx 写道
估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.

为什么要在flex端重新声明一遍对象?
>主要是为了编程方便(引入之后直接“点”就出来属性、方法了)和增加可维护性(属性一眼就能看出来是哪个,比hashmap的方式可维护性高吧)。

非要用到对象的话,我会用spring。
>我没大搞明白你说的是什么意思,flex端重新写类跟用不用spring没什么关系吧。



其实还是习惯问题,虽然FLex是Ria,但我还是习惯让它只显示控件而不承担具体的业务逻辑,也就是说一般不会在Flex端做类去封装.

我现在用spring-flex-1.5.0.M2,flex客户端只放控件,所需的数据和业务逻辑等都是通过RemoteObject交到java端去处理.

java端应建立PictureLogic层来接收Flex的界面请求,然后交由BusinessLogic层来处理业务规则,此后会调用到Dao层去访问数据库,当然你也可以加入Hibernate(好像lazyload会有问题,没试过),最终把获得的结果通过BlazeDS传回flex客户端.
而我习惯使用spring的JdbcTemplate类的queryForMap方法来传递数据到Flex端,这样传递的是HashMap格式的数据,非常便于Flex控件来显示.
3 楼 wanliang 2011-04-14  
学习了,谢谢lz
2 楼 fandayrockworld 2011-04-13  
xlightningx 写道
估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.

为什么要在flex端重新声明一遍对象?
>主要是为了编程方便(引入之后直接“点”就出来属性、方法了)和增加可维护性(属性一眼就能看出来是哪个,比hashmap的方式可维护性高吧)。

非要用到对象的话,我会用spring。
>我没大搞明白你说的是什么意思,flex端重新写类跟用不用spring没什么关系吧。
1 楼 xlightningx 2011-04-11  
估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.

相关推荐

    使用BlazeDS实现Java和Flex通信

    总结来说,使用BlazeDS实现Java和Flex通信的关键步骤包括:安装和配置JDK和Tomcat、部署BlazeDS war文件、在Eclipse中创建Flex项目并与BlazeDS集成、配置安全性和数据交换机制。通过这种方式,开发者能够构建出既...

    最简单的BlazeDS实现flex与java通信.rtf

    最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的...

    使用BlazeDS实现flex与java 整合

    5. **数据交换**:BlazeDS的AMF协议可以将Java对象透明地转换为Flex可以理解的格式,反之亦然,从而实现数据的双向交换。 三、关键技术 1. **AMF**:AMF是一种二进制的序列化格式,它比XML或JSON更高效,更适合于...

    使用BlazeDS实现Java和Flex通信之hello world

    在IT行业中,BlazeDS是一个重要的中间件,它允许Java应用程序与Adobe Flex客户端进行实时的双向通信。这个“使用BlazeDS实现Java和Flex通信之hello world”示例旨在介绍如何通过BlazeDS来实现简单但关键的客户端-...

    51CTO下载-使用BlazeDS实现Java和Flex通信(PDF+源码

    本文将深入探讨如何使用BlazeDS来实现Java和Flex之间的通信,以及这个过程中涉及的关键技术和实践步骤。 1. **BlazeDS概述** BlazeDS是基于AMF(Action Message Format)协议的轻量级中间件,它可以提供实时的、低...

    用BlazeDS实现Java和Flex通信

    ### 使用BlazeDS实现Java与Flex通信的关键知识点 #### 一、引言 随着Web技术的发展,前后端的通信方式也变得越来越多样化。其中,Flex作为一种流行的应用开发框架,经常被用于构建丰富的互联网应用程序(RIA)。...

    Flex +BlazeDS+java后台分页的实现

    Flex + BlazeDS + Java 后台分页的实现是一个关键的技术环节,特别是在开发大型Web应用程序时,为了提高用户体验和系统性能,数据通常需要通过分页的方式进行加载。本方案主要探讨了如何在Flex前端和BlazeDS中间件与...

    BlazeDS实现java后台消息推送flex前台接收的例子

    在"BlazeDS实现java后台消息推送flex前台接收的例子"中,我们主要关注以下几个关键知识点: 1. **BlazeDS架构**:BlazeDS包含了一组服务,如Remoting服务、LiveCycle Data Services(LCDS)以及MessageBroker服务。...

    Flex Spring JAVA BLAZEDS整合

    【Flex Spring JAVA BLAZEDS整合】是一种技术实践,它将Adobe Flex的前端展示层与Spring框架的后端业务逻辑层紧密结合,利用BlazeDS作为中间件进行数据传输。Flex作为一个强大的RIA(富互联网应用程序)开发平台,常...

    flex与java通过BlazeDs进行交互

    在代码示例中,我们看到一个名为`HelloWorld`的Java类,它有一个名为`sayHelloWorld`的方法,接收一个字符串参数并返回一个包含问候语的字符串。这个方法将在Flex客户端被调用,以展示Flex与Java之间的交互。 在...

    使用BlazeDS实现Flex与Java通信

    BlazeDS 是一款开源的服务器端软件,它主要用于在客户端的 Flex 或 Adobe AIR 应用程序与服务器端的 Java 对象之间实现数据交互。通过 BlazeDS,你可以方便地调用 Java 对象的方法,并且它还提供了远程调用...

    BlazeDS实现flex与java通信

    在本文中,我们将深入探讨如何使用BlazeDS实现Flex与Java之间的通信,以及其核心功能和工作原理。 1. **Remoting服务** BlazeDS的Remoting服务允许Flex客户端直接调用Java后端的远程方法,仿佛这些方法是本地的。...

    基于BlazeDS实现股票系统中Flex与Java的通信.pdf

    本文介绍了基于BlazeDS技术在股票系统中解决Flex前台与Java后台之间的通信问题,并以股票系统中的算法调用为例,展示了BlazeDS的具体配置方法和实现细节。 一、 Flex技术概述 Flex是一种高效、免费的开源框架,也...

Global site tag (gtag.js) - Google Analytics