论坛首页 编程语言技术论坛

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

浏览 4401 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-18  

环境: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对象,这个我还没研究出来,期待大家探讨。

 

 

   发表时间:2011-04-11  
估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.
0 请登录后投票
   发表时间:2011-04-13  
xlightningx 写道
估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.

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

非要用到对象的话,我会用spring。
>我没大搞明白你说的是什么意思,flex端重新写类跟用不用spring没什么关系吧。
0 请登录后投票
   发表时间:2011-04-14  
学习了,谢谢lz
0 请登录后投票
   发表时间: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控件来显示.
0 请登录后投票
   发表时间: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没两样了,优势真体现不出来。
0 请登录后投票
   发表时间:2011-04-19  
嗯,我会试一试,刚在论坛上看到一个类似spring的flex端框架,能够实现IOC,目前正在学习.估计这个能解决你最开始提出的类互相引用的问题.
0 请登录后投票
   发表时间:2011-04-28  
楼主分析很不错。。我做开发的时候倒是没有关注这个事情。。。

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

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics