Flex远程调用机制RemoteObject应用技巧
转自:http://zerozone.javaeye.com/blog/60846
Flex远程调用RemoteObject出现的问题及解答:
本文主要讨论Flex在客户端与J2EE中间层数据交互的过程。
Flex是构建RIA应用的客户端技术。它的优势在于提供了丰富的客户 端表现能力(例如增强UI组件、缓存、拖放、收缩/展开等),避免了基于HTML技术的缺陷;同时无缝地结合了J2EE技术在中间层(业务逻辑层)的强大优势。
尽 管MacroMedia提出的"体验经济"有宣传策略的成分,但RIA、Ajax的流行还是说明富客户端技术有市场需求。正如J2EE平台架构一样,任何 技术都不是完美的。每个新技术的出现都是为了解决特定的问题。J2EE构建Web应用已经很成熟,已经有很多好的实践,不过受J2EE自身的限制,它在展 现富客户端方面能力有限(JSF的出现也许会解决这个问题)。
基 于RPC的HTTPService、WebService和RemoteObject是常见的数据访问机制。根据官方资料,RemoteObject在性 能和开发效率方面表现比较好。基于XML文本协议的数据封装方式如WebService/HTTPService在大用户并发情况及负载过重的情况下, RemoteObject采用的AMF(Actice Message Format,目前版本是AMF3)效率更高。AMF协议是一种给予HTTP的二进制协议,把中间层的业务对象(主要是商业数据对象)由Java序列化再 反序列化为ActionScript对象。
RemoteObject使用过程有几个问题也比较麻烦。
1.编译、配置过程烦琐,例如常见的unknown destination问题就是由于编译或配置过程有误造成的。
2. 编写与Java对象对应的ActionScript对象也是一个比较烦琐的过程。可以归为重复性而且意义不大的工作。可以考虑由工具完成此项任务。想象一 下,对于一个面临需求变化且规模较大的项目,要维护ActionScript与对应Java对象的映射,确实不是件令人愉快的事情。
遇到的几个问题:
1.unknown destination
出错原因可能是flex编译器未制定service参数。
解决方法:在Flex Builder或安装FlexBuilder2插件的Eclipse环境中设置编译器参数,选中Flex项目右键,选中properties,再选择Flex Complier,在附加参数中增加相应参数及值。例如下面两个,黑体是修改前,红体字是修改后。
-locale en_US
-locale en_US -context-root=/flex -services="C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\flex\WEB-INF\flex\services-config.xml"
2.could't invoke XXX method(例如调用具体RO的GetQuote,误写成getQuote)
原因大概是由于具体RO的函数名写错了,由于MXML语言大量使用参数注释型的方式指定对象属性,导致在引号之内的标记无法被编译器识别,问题被延迟到Run-time时刻发现。
3.Send failed
原因是service-config.xml中的channels定义my-amf的{context.root}在Flex Builder编译器参数中未指定其context-root,导致编译的swf文件可能有误;
解决方法同1
4.Ljava.lang.NoSuchMethodError...
原 因是RO对应的Java代码中可能出现调用不存在的方法。例如某个RO对应Java类Ticker在其函数中GetQuote中new一个 StockQuote实例StockQuote x = new StockQuote(param1,param2),但StockQuote类只有一个空参数的构造函数,因此NoSuchMethodError错误 被传递到Flex调用RO的客户端。为什么会出现Ticker引用不存在的StockQuote构造函数,原因是没有及时同步代码。比如, StockQuote代码修改了,删除了带参数的构造函数,而依赖此类的Ticker没有及时修正。
5.ReferenceError: Error #1056: 无法为 a 创建属性 b
这是一个奇怪的问题,所有同步Java对象类的ActionScript类,即通过metadata关键字RemoteClass指定的类。对应Java类的属性名称不能以大写字母开头。
例如,StockQuote类在java
java 代码
- package com.stockquote;
- public class StockQuote {
- public StockQuote(){}
- public String getCompany(){
- return Company;
- }
- public void setCompany(String company){
- this.Company = company;
- }
- public double getPrice(){
- return price;
- }
- public void setPrice(double price){
- this.price = price;
- }
- private String Company;
- private double price;
- }
在ActionScrpit中,Company和price必须以小写开头,否则会出错,即无法在Flex调用端反序列该字段。
java 代码
- package com.stockquote{
- [Bindable]
- [RemoteClass(alias="com.stockquote.StockQuote")]
- public class StockQuote{
- function StockQuote () {
- // Constructor code if needed
- trace(this);
- }
- public function getCompany():String{
- return Company;
- }
- public function setCompany(company:String ):void{
- this.Company = company;
- }
- public function getPrice():Number{
- return price;
- }
- public function setPrice(price:Number):void{
- this.price = price;
- }
- public var Company:String;
- public var price:Number;
- }
- }
如上代码,会导致以下错误。
ReferenceError: Error #1056: 无法为 com.stockquote.StockQuote 创建属性 company。
Flex远程调用机制RemoteObject应用技巧的更多相关文章
- 8.9.网络编程_Socket 远程调用机制
1.网络编程 1.1.网络编程概述: 通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络.在操作系统.网络管理软件及网络 通信协议的管理和协调下,可以 ...
- Hadoop远程调用机制
- 架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)
在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调 ...
- 远程调用历史及代码编写demo
历史介绍部分: 远程调用大致经过了corba.webservice.二进制跟restful四个阶段 corba时代,corba(Common Object Request Broker Archite ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- .Net组件程序设计之远程调用(一)
.Net组件程序设计之远程调用(一) 1应用程序域 我们知道我们写的C#代码是在操作系统逻辑体系结构中最上层的,然而操作系统本身是不会认识C#代码的,它只认识机器代码.那我们写的程序经过编译后是编译成 ...
- Spring远程调用技术<3>-Spring的HTTP Invoker
前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙. 另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...
- Spring远程调用技术<1>-RMI
在java中,我们有多种可以使用的远程调用技术 1.远程方法调用(remote method invocation, RMI) 适用场景:不考虑网络限制时(例如防火墙),访问/发布基于java的服务 ...
- Hessian怎样实现远程调用
1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持. Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实 ...
随机推荐
- 线程间通信:Queue
线程间使用队列来互相交换数据,数据可以是字符串 .列表 .元组等,Queue 是提供队列操作的模块,常见的队列如下: FIFO:First In First Out 先进先出队列,也就是最先放进去的数 ...
- UE4 Run On Server与Run on owning client
- $.post和jquerySubmit返回json数据获取的区别
$.post("/patrol/patrolDataContent!deleteContent.action",{"ids":ids},function(dat ...
- 关于Android原生Email的自己的一些认识
http://blog.csdn.net/gloryhero/article/details/47259583 Email的框架图: Email 包含3个包:Eamil.Exchagne.Unifie ...
- 部署软件RDMA的步骤
date: 2018-08-28 19:46:56 参考原文原文:http://corasql.blog.51cto.com/5908329/1930455 ...
- PL/SQL developer 可以连接本地数据库,但是不可以连接远程数据库的解决方法
修改Oracle_home目录下的 network\ADMIN\tnsnames.ora 文件, 在其中增加远程数据库对应的记录,类似下边这样: .2_orcl = (DESCRIPTION = (A ...
- mysql的TIMESTAMPDIFF
SELECT (TIMESTAMPDIFF(MINUTE, STR_to_date('2018-8-30 12:15:52', '%Y-%m-%d %H:%i:%s') , STR_to_date(' ...
- Python开发【模块】:PyMySQL
PyMySQL 1.安装 [root@localhost ~]# pip install PyMySQL 2.初识 创建数据表结构: mysql> CREATE TABLE `users` ( ...
- Linux内核之vmlinux与vmlinuz
因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux vmlinux是一个包括linu ...
- 邮件服务器Postfix的管理 重启php-fpm
Postfix邮件系统安装与配置:Postfix,Cyrus-IMAP,Cyrus-sasl,Dovecot和SPFhttp://www.freehao123.com/postfix-cyrus/Ce ...