昨天将本地开发的基于Flash Remoting调用的Flex应用发布到远端的开发机上,该Flex应用在本地调试一切正常,可是在开发机上却出现了下面这样的错误:
[Flex] Exception when invoking service: coldfusion-flashremoting-service
with message: Flex Message (flex.messaging.messages.RemotingMessage)
operation = call
clientId = 4C6CFCF0-4D0C-0988-BFD4-C70613327B57
destination = ColdFusion
messageId = D76F2B1C-51F4-E76E-4184-46FB48FA673B
timestamp = 1165127909789
timeToLive = 1165127909789
body = null
hdr(DSEndpoint) = my-cfamf
exception: flex.messaging.MessageException: flex/messaging/io/amf/UnknownTypeException
[Flex] Error handling message: flex.messaging.MessageException: flex/messaging/io/amf/UnknownTypeException
incomingMessage: Flex Message (flex.messaging.messages.RemotingMessage)
operation = call
clientId = 4C6CFCF0-4D0C-0988-BFD4-C70613327B57
destination = ColdFusion
messageId = D76F2B1C-51F4-E76E-4184-46FB48FA673B
timestamp = 1165127909789
timeToLive = 1165127909789
body = null
hdr(DSEndpoint) = my-cfamf
errorReply: Flex Message (flex.messaging.messages.ErrorMessage)
clientId = null
correlationId = D76F2B1C-51F4-E76E-4184-46FB48FA673B
destination = ColdFusion
messageId = 4C6CFD01-640E-6596-2A22-005D0A6855A8
timestamp = 1165127909797
timeToLive = 0
body = null
code = Server.Processing
message = flex/messaging/io/amf/UnknownTypeException
details = null
rootCause = java.lang.NoClassDefFoundError: flex/messaging/io/amf/UnknownTypeException
body = null
extendedData = null
我本地的主机系统是Ubuntu 6.10,而远端的是Red Hat Enterprise Linux AS release 4,首先排除是编码的问题,因为本地调试一切正常,也不是配置的问题,因为我Ubuntu上和Redhat上的Coldfusion都是默认配置,没有任何的修改,那是不是安装的问题,以至于缺少类库呢,将ubuntu上的lib复制到redhat上,还是一样的错误,那是什么原因呢,Yahoo了下,原来也有其他人碰到和我一样的问题,原来这是Coldfusion在Redhat系统中的一个Bug,其中renaun.com提到了一个解决的方法,那就是先安装Coldfusion7.01,再安装Coldfusion 7.01更新包(coldfusion-70-updater-lin.bin),最后安装Coldfusion 7.02更新包(coldfusion-70-updater2-lin.bin),据说这样就可以解决问题,可是Coldfusion7.01的安装文件早在我升级为Coldfusion7.02时已经被我给删除了,而Adobe的官方网站也不再提供7.01下载了,那么renaun提到的这个解决方法对于我就不适用了。
既然不能用前人的方法,那就只有自己解决了,以上的错误信息貌似找不到flex.messaging.io.amf.UnknownTypeException类,还好我是Java出身,先把coldfusion flash gateway给crack了,添加上debug信息,一查看发现在初始化CFASSerializer时失败,那是不是CFASSerializer里面找不到flex.messaging.io.amf.UnknownTypeException类呢?
继续crack CFASSerializer,而CFASSerializer类其实需要import的是:flashgateway.io.UnknownTypeException,这就奇怪了,怎么会报缺少flex.messaging.io.amf.UnknownTypeException呢,而相同的代码在Ubuntu上却不会出现这样的错误?!难道是Coldfusion类导入器出了问题?!这个问题就大了,Coldfusion的类导入器那可是Coldfusion的灵魂哦,咱就不好乱折腾了,没有正确源代码的情况下就不好修改了。
又不能重新安装,又不能修改源码,既然说找不到flex.messaging.io.amf.UnknownTypeException类,那我自己写个flex.messaging.io.amf.UnknownTypeException让它找到不就可以了吗?嘿嘿,就这么办,以下是flex.messaging.io.amf.UnknownTypeException类的源码,参照的是flex.messaging.io.UnknownTypeException写的:
[java]
package flex.messaging.io.amf;
import flex.messaging.io.SerializationException;
public class UnknownTypeException extends SerializationException {
public UnknownTypeException() {
}
}
编译,打包,将其放置到$coldfusion/servers/cfusion/cfusion-ear/cfusion-war/WEB-INF/cfusion/lib/($coldfusion指的是Coldfusion的安装路径,我这里Coldfusion是多服务器的安装方式,单服务器安装的方式目录有些变化,您自己相应的调整就可以了)下,重启Coldfusion,一切正常,嘿嘿,解决好了。
以上是非官方的解决方法,希望Adobe马上会修复这个错误,其他朋友要碰到以上的错误可以直接下载这个修复包,安装方法如下:
[bash] wget http://labs.eshangrao.com/flex/2/flex-messaging-patch-byFeiy.jar cp flex-messaging-patch-byFeiy.jar\ $coldfusion/servers/cfusion/cfusion-ear/cfusion-war/WEB-INF/cfusion/lib/
然后重新启动Coldfusion就可以了。
O comments at "RedHat下Flash Remoting调用CFC报UnknownTypeException的解决方法"
Comment Now!