我通过BlazeDS向我的Flex应用程序公开了一个Spring bean。在我的Java代码中,我返回强类型列表。 e.g。
public List<Folder> getFolders(String path) {
return dao.getFolders(path);
}
Flex应用程序将数据作为AS3对象实例的ArrayCollection接收 - 即不是我想要的文件夹的ArrayCollection。我按如下方式注释了我的Flex类:
package myproject.vo {
import com.adobe.cairngorm.vo.IValueObject;
import mx.collections.ArrayCollection;
[Bindable]
[RemoteClass(alias="myproject.vo.Folder")]
public class Folder extends PersistentObject implements IValueObject {
public function Folder() {}
}
}
我检查过我的Java Folder类中有getter / setter,以匹配Flex Folder类中的属性。有什么想法吗?
答案 0 :(得分:11)
我终于通过一些谷歌搜索解决了这个问题。以下是我发现的Flex远程处理规则:
注释Flex值对象以指示与其相关的Java类。如果包名称不同,这是必不可少的。 - 例如[Bindable] [RemoteClass(alias =“package.JavaClass”)] public class FlexClass {}
构造函数必须匹配Flex和Java值对象。为了简单起见,我最终坚持使用公共的非参数构造函数。
Getters和setter必须匹配Flex和Java值对象。
最后一条规则是一个破解者 - 你必须实例化你需要反序列化的任何类。从表面上看这应该不是问题,但是我花了好几天试图反序列化远程getObjectsAtPath()调用的结果 - 包含Folder和Document实例的PersistentObjects列表(两者都是PersistentObject的子类)。如果你没有显式地实例化类(在我的情况下是Folder类),它不会包含在SWF文件中(与Java不同)!我最终创建了一个类型为Folder的虚拟变量来解决这个问题。
感谢大家的建议。
答案 1 :(得分:0)
我正在查看我的所有服务器端代码,我不记得这是否有必要,但在Java方面,我将返回值声明为强类型列表:
public List<Folder> getFolders(String path) {
return dao.getFolders(path);
}
答案 2 :(得分:0)
Java泛型在编译时被删除。 JVM在运行时不会键入集合。无论如何,我没有看到你的调用代码,但它应该将java中返回的值放入一个声明有点像这样的变量:
folders:ArrayCollection.<String>
答案 3 :(得分:0)
你提到你的Folder类很复杂;这是否意味着它包含对其他对象的引用?在这种情况下,您不必映射每个其他类(并检查setter / getters,尤其是布尔值)?