`
fandayrockworld
  • 浏览: 308979 次
  • 性别: 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.

相关推荐

Global site tag (gtag.js) - Google Analytics