Flex传ArrayCollection到java中Collection小插曲中的发现

来源:互联网 发布:药师考题软件 编辑:程序博客网 时间:2024/05/22 16:55

说在前言:在公司搞了半年多的jsp,最近要转向flex,搞富客户端。

关于flex优缺点、如何与java通讯本人也是一知半解,刚接触两周左右,没有很深的理解。声明,在帖子中描述的问题,也许根本就不是问题,只是个人了解还甚少的结果,如果是这样,还烦请大家指出。

本文是有这样一个对话引起发的。

a:我勒个去,真是让人郁闷啊!

b:什么个情况?如实道来,让大家开心下。

a:是这样的,我在flex中的vo中定义了一个arraycollection集合,并将该vo与服务器端(java)的dto绑定,但是dto无论如何也接收不到这个集合。我抑郁啊。

b:额,这算哪儿门子问题啊。

a:哎。。。

b:也就是说,前端的arraycollection,服务器端木有接收到呗。(新手是不是也总遇到啊!)我帮你解决吧。

于是乎就有了下文。

签于前端传值后端接不到的状况,我测试的思路如下:在flex中创建一个testvo,里面就放一个arraycollection类型的变量,并与java中创建的testdto绑定,testdto中放置一个list集合接收前端的arraycollection。

代码如下:

testvo:

package net.greatsoft.communication.organization.vo

{

import mx.collections.arraycollection;

[bindable]

[remoteclass(alias="net.greatsoft.communication.organization.flex.dto.testdto")]

public class testvo

{

public function testvo()

{

}

public var _tests:arraycollection;

public function get tests():arraycollection

{

return _tests;

}

public function set tests(value:arraycollection):void

{

_tests = value;

}

}

}

testdto:

package net.greatsoft.communication.organization.flex.dto;

import java.util.arraylist;

import java.util.list;

public class testdto {

private listagencytreedto> trees;

public listagencytreedto> gettrees() {

return trees;

}

public void settrees(listagencytreedto> trees) {

this.trees = trees;

}

}

java的ro中定义一个为前端提供服务的方法,test(testdto dto):

public void test(testdto dto){

system.out.println(dto.gettests().size() + "-----------------------------");

}

省略一些无用代码。

看mxml中的调用,在页面中放置一个button,侦听button的click事件,在事件的回调函数中,构造两个testvo,并传递给java的testdto,在ro中获取到testdto,输入它的长度。继续对调用的返回结果添加侦听事件,如果成功则输出:传输成功,失败则输出:失败啦。

代码如下:

1、button的click事件处理

protected function btntest_clickhandler(event:mouseevent):void

{

var testvo:testvo = new testvo();

var trees:arraycollection = new arraycollection();

var tree1:agencytreevo = new agencytreevo();

tree1.id = "1";

tree1.name = "sfdfsdfdsfdffsdfds";

var tree2:agencytreevo = new agencytreevo();

tree2.id = "2";

tree2.name = "sfdfsdfdsfdffsdfds";

trees.additem(tree1);

trees.additem(tree2);

testvo.tests = trees;

agencyproxy.test1(testvo).addresultlistener(result_handler).addfaultlistener(fault_handler);

}

2、成功返回结果处理事件

private function result_handler(envet:resultevent):void{

alert.show(" 传值成功");

}

3、失败处理事件

private function fault_handler(event:faultevent):void{

alert.show("失败啦");

}

其实明眼人一下就能看出接收不到值得原因,但它不是本文的重点。重点是调试这个低级错误时无意中的收获。

1、运行项目,运行结果如下图:

后台无任何反应。不知问题出在哪。也没有输出size,奇了怪了。

2、修改test(testdto testdto)方法,如下:

public void test(testdto dto){

try {

system.out.println(dto.gettrees().size() + "-----------------------------");

} catch (exception e) {

e.printstacktrace();

}

}

也就是加上捕获异常。

运行结果如下:

哈哈,传值成功,但是看一眼后台,心灰意冷啊。

java.lang.nullpointerexception at

net.greatsoft.communication.organization.flex.organizationro.test(organizationro.java:150)

空指针异常啊,万恶的java的空指针异常啊。

更让我纳闷儿的是,在后台将异常捕获后,flex中将返回结果视为正常结果,在跟踪了flex的代码后发现,此处flex亦是捕获异常,如有异常则跳转到返回结果失败处理回调函数中(fault_handler),如无异常则跳转到返回结果成功回调函数处理。由于时间已经有点晚了,没有一步步去跟踪,将flex捕获异常的确切位置贴出来,但是它确实是那样处理的。感情去的朋友,可以自己去跟踪下。

这里得出一条经验:在flex结合java的应用程序中,不要在服务器端也就是java代码中捕获异常,这样会影响前端对结果的处理。

2、既然得知哪里抛出空指针异常,那把它改掉。

其实是在这里:private list trees,好吧,死马当活马医了。new一个list出来。

package net.greatsoft.communication.organization.flex.dto;

import java.util.arraylist;

import java.util.list;

public class testdto {

private listagencytreedto> trees = new arraylistagencytreedto>();

public listagencytreedto> gettrees() {

return trees;

}

public void settrees(listagencytreedto> trees) {

this.trees = trees;

}

}

继续运行程序。

嘿嘿,传值成功喽,后台打印:0-----------------------------。额,怎么可能,明明arraylist的size应该是2啊。继续找原因。

在这里其实依然有一条经验:private list trees = new arraylist(),它依旧会造成灰常隐晦的问题。这里解决了空指针异常问题,但是无论flex传递给java的参数时候传递成功,给flex的反馈都是成功的反馈,即没有发生异常。感兴趣的朋友可以将java的ro中的捕获异常去掉。结果依旧。

2、好啦,不卖关子了,其实flex传arraycollection,java端接收不到是因为vo中属性名称和dto中属性名称不一致造成的。细心啊,粗心搞死人啊。

将dto中trees改为tests。

运行程序。

后台输出:2-----------------------------。

到此flex传递arraycollection到java成功。废了不少力气。

b一定也看到怎么解决的了吧,赶紧去a那里炫耀一下吧。可别告诉他你废了多少力气啊。哈哈。

总结一下:

1、在flex与java结合的应用中,切忌vo与dto(或者实体)的属性名称要对应,blazeds在做flex转java类型的反序列化的需要吧,猜测。初学者很可能忽略这一点。

2、在处理结果集回调函数时,flex是捕获运行时异常,如发生异常则回调函数采用侦听结果集失败是件,否则采用侦听结果集成功事件处理。

1、在java的dto(或者实体)中的属性,尽量不要去new,可能会影响侦听结果集成功、失败事件的判定。如:private list trees = new arraylist()。

时间不早了,头脑有些不太清醒,语言描述可能不清晰,烦请各位见谅。其实有些饿了。。。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击