首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

flex与+java+通信常见异常

2012-11-22 
flex与+java+通信常见错误1. [RPC Fault faultStringSend failed faultCodeClient.Error.MessageSend

flex与+java+通信常见错误

1. [RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 404: url: 'http://localhost:8080/WebContent/messagebroker/amf'"]

在.mxml中加入endpoint="http://localhost:8080/flexweb/messagebroker/amf"
<mx:RemoteObject destination="hello" id="h" result="gg(event)" endpoint="http://localhost:8080/flexweb/messagebroker/amf" />
2. [RPC Fault faultString="Cannot create class of type 'UserManager'."
faultCode="Server.ResourceUnavailable" faultDetail="Type 'UserManager' not
found."]
错误原因:remoting-config.xml配置的java类路径错误或java类不存在
解决:配置正确路径。
endpoint="http://localhost:8080/flexweb/messagebroker/amf" flexweb配置有错

(1) [RPC Fault faultString="[MessagingError message='Unknown destination
'UserManager'.']" faultCode="InvokeFailed" faultDetail="Couldn't establish
a connection to 'UserManager'"]
错误原因:remoting-config.xml配置的java类路径错误或java类不存在
解决:配置正确路径。
(2)[ RPC Fault faultString="[MessagingError message='Unknown destination
'UserManager'.']" faultCode="InvokeFailed" faultDetail="Couldn't establish a
connection to'UserManager'"]
错误原因:java版本问题,JRun 4.0支持到jdk1.4.2,不支持1.5
解决:使用jdk1.4.2
(3) [RPC Fault faultString="Cannot create class of type 'UserManager'."
faultCode="Server.ResourceUnavailable" faultDetail="Type 'UserManager' not
found."]
错误原因:remoting-config.xml配置的java类路径错误或java类不存在
解决:配置正确路径。
注:我的这个remoting-config.xml配置的java类应放在
%\fds2\jrun4\servers\default\flex\WEB-INF\classes\下
(4) Unsupported major.minor version 49.0异常;
错误原因:在J2SE1.4的时候编译的是J2SE1.4的字节码形式,在J2SE5.0是5.0的字节码形式,一般只具有向下兼容性,也就是说在J2SE5.0中可以运行J2SE1.4的字节码,但是反过来则不行,在J2SE1.4下运行了J2SE5.0编译出来的字节码,就会出现上面所说的java.lang.UnsupportedClassVersionError错误了。最后,还要注意一点的是,不仅你的class文件要注意,所有在classpath下用到的lib的jar文件的版本也要注意,如果jar文件里面的class以前是高版本JDK编译出来的字节码形式,那也同样会出java.lang.UnsupportedClassVersionError错误的。
解决:原来是Eclipse里面的设置有了点问题(不知道什么时候被改了)。打开Window--->Preferences,选择里面的Java里面的Compiler,修改右面的Compiler compliance level:的值为1.4。


另外:
我在网上看到的错误,但我这里没发生的:
1.could't invoke XXX method(例如调用具体RO的GetQuote,误写成getQuote)
原因大概是由于具体RO的函数名写错了,由于MXML语言大量使用参数注释型的方式指定对象属性,导致在引号之内的标记无法被编译器识别,问题被延迟到Run-time时刻发现。
2.Send failed
原因是service-config.xml中的channels定义my-amf的{context.root}在Flex Builder编译器参数中未指定其context-root,导致编译的swf文件可能有误;
如图:

解决方法:将Context root路径改为你的项目名称路径, 如图

3.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没有及时修正。
4.ReferenceError: Error #1056:无法为a创建属性b
这是一个奇怪的问题,所有同步Java对象类的ActionScript类,即通过metadata关键字RemoteClass指定的类。对应Java类的属性名称不能以大写字母开头。
5.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。

?

?

Server.ResourceUnavailable

flex端.mxml代码

?

remoteObject的定义

<mx:RemoteObject id="pn" destination="plan">
<mx:method name='helloWorld' result="handler(event)"/>
< /mx:RemoteObject>

?

在上面的name属性里面的方法要和Java端定义的方法同名

如:name='helloWorld' 那么在Java端同样有一个helloWorld的方法,否则在flex端调用helloWorld的时候,中间层不知道到底调用Java端的那个方法。

?

在flex文件夹的remoting_config.xml文件中一定要有定义好的中间层的配置

<destination id="plan">
<properties>
<source>com.flex.(此处是Java端的类名)</source>
</properties>
</destination>

?

当调用后如果出现:

[RPC Fault faultString="Cannot invoke method 'helloWorld'." faultCode="Server.ResourceUnavailable" faultDetail="Method 'helloWorld' not found."]

可能的原因是:

1.配置的路径不对

2.在Java端的helloWorld方法的属性是是private,应该改成public才可以。

热点排行