如何从 BlazeDS 获取强类型集合? [英] How do I get a strongly typed collection from BlazeDS?

查看:20
本文介绍了如何从 BlazeDS 获取强类型集合?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经通过 BlazeDS 向我的 Flex 应用程序公开了一个 Spring bean.在我的 Java 代码中,我返回强类型列表.例如

I've exposed a Spring bean to my Flex app via BlazeDS. In my Java code I return strongly typed lists. e.g.

public List<Folder> getFolders(String path) {
    return dao.getFolders(path);
}

Flex 应用程序将数据作为 AS3 对象实例的 ArrayCollection 接收 - 即不是作为我想要的文件夹的 ArrayCollection.我已将我的 Flex 类注释如下:

The Flex app receives the data as an ArrayCollection of AS3 Object instances - i.e. not as a ArrayCollection of Folders which is what I want. I've annotated my Flex class as follows:

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 类中的属性.有什么想法吗?

I checked that I had getters/setters on my Java Folder class to match the properties in my Flex Folder class. Any ideas?

推荐答案

经过一番谷歌搜索,我终于解决了这个问题.以下是我发现的 Flex 远程处理规则:

I finally resolved this issue following a bit of Googling. Here are the rules of Flex remoting that I found:

  1. 对 Flex 值对象进行注释以指示它所关联的 Java 类.如果包名不同,这很重要.– 例如[Bindable][RemoteClass(alias="package.JavaClass")] 公共类 FlexClass {}

  1. Annotate the Flex value object to indicate the Java class that it relates to. This is essential if the package name differs. – e.g. [Bindable][RemoteClass(alias="package.JavaClass")] public class FlexClass {}

构造函数必须在 Flex 和 Java 值对象中匹配.为了保持简单,我最终坚持使用公共无参数构造函数.

The constructors MUST match in Flex and Java value objects. I ended up sticking to public no-args constructors just to keep it simple.

Getter 和 setter 必须在 Flex 和 Java 值对象之间匹配.

Getters and setters MUST match between Flex and Java value objects.

最后一条规则是一个破解者——你必须实例化任何你需要反序列化的类.从表面上看,这应该不是问题,但是我花了几天时间试图反序列化远程 getObjectsAtPath() 调用的结果 - 一个 PersistentObjects 列表,其中包含 Folder 和 Document 的实例(两者都是 PersistentObject 的子类).如果您没有显式实例化该类(在我的例子中是 Folder 类),它就不会包含在 SWF 文件中(与 Java 不同)!我最终创建了一个 Folder 类型的虚拟变量来解决这个问题.

The last rule is a cracker – You MUST instantiate any classes that you need to deserialize to. On the face of it this shouldn’t be a problem however I spent days trying to deserialize the results of a remote getObjectsAtPath() call - a list of PersistentObjects which contained instances of Folder and Document (both are subclasses of PersistentObject). If you don’t explicitly instantiate the class (in my case the Folder class) it does NOT get included in the SWF file (unlike Java)! I eventually create a dummy variable of type Folder to get around this.

感谢大家的建议.

这篇关于如何从 BlazeDS 获取强类型集合?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆