浏览 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对象,这个我还没研究出来,期待大家探讨。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-11
估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.
|
|
返回顶楼 | |
发表时间:2011-04-13
xlightningx 写道 估计是远程对象引用方面的问题,能解答这个问题的估计要java方面的专家了!不过,楼主能说说为什么要在flex端重新声明一遍对象吗?我一般在flex端只接收java端传来的hashmap的值;如果非要用到对象的话,我会用spring.
为什么要在flex端重新声明一遍对象? >主要是为了编程方便(引入之后直接“点”就出来属性、方法了)和增加可维护性(属性一眼就能看出来是哪个,比hashmap的方式可维护性高吧)。 非要用到对象的话,我会用spring。 >我没大搞明白你说的是什么意思,flex端重新写类跟用不用spring没什么关系吧。 |
|
返回顶楼 | |
发表时间:2011-04-14
学习了,谢谢lz
|
|
返回顶楼 | |
发表时间: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控件来显示. |
|
返回顶楼 | |
发表时间: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没两样了,优势真体现不出来。 |
|
返回顶楼 | |
发表时间:2011-04-19
嗯,我会试一试,刚在论坛上看到一个类似spring的flex端框架,能够实现IOC,目前正在学习.估计这个能解决你最开始提出的类互相引用的问题.
|
|
返回顶楼 | |
发表时间:2011-04-28
楼主分析很不错。。我做开发的时候倒是没有关注这个事情。。。
现在想想。。还真觉得 应该看看这个东西。。。期待楼主 更好的分析。。 |
|
返回顶楼 | |