我用的是flex4+cairgorm3。
flex端需要捕捉java端抛出的异常,之前的做法是:
<fx:Declarations>
<rule:AddUserCommand/>
</fx:Declarations>
在AddRuleCommand.as中,定义如下方法:
[CommandFault(selector="add")] public function error(fault:Fault):void { if(fault.rootCause != null) { Alert.show(fault.rootCause.message,"错误"); }else{ Alert.show(fault.faultString,"错误"); } }
Java端抛出异常:
throw new CollectUserException("添加用户时,名字不能为空");
可是这样,当java端抛出异常时,前端却毫无反应。这里我们要做出修改:
在Context里面用到parsley的DynamicCommnad标签:
<fx:Declarations>
<DynamicCommand type="{AddUserCommand}" selector="add"/>
</fx:Declarations>
AddRuleCommand.as改为:
public function error(fault:Fault):void
{
if(fault.rootCause != null && fault.rootCause.message != undefined)
{
Alert.show(fault.rootCause.message,"错误");
}else{
Alert.show(fault.faultString,"错误");
}
}
这里注意:去掉了[CommandFault(selector="add")],因为我们已经在DynamicCommand里面定义了。这样就能够显示异常弹出框了。
--------------------------------------------------------------------
DynamicCommand:
对于Command层,方法至少有三个:execute,result和fault,代码如下:
public class SaveUserCommand {
[Inject]
public var service:RemoteObject;
public function execute (event:UserEvent) : AsyncToken {
return service.saveUser(event.user);
}
public function result (user:User) : void {
// do something with the result
}
public function error (fault:Fault) : void {
// do something with the result
}
}
我们一般用一个完整的命令对象对结果进行处理。这个对象仅是单个方法,用于执行命令。
parsley为每个匹配消息创建一个新的命令实例。多个命令对象可以并发执行,并且不进行任何交互。