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

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

问题描述

我通过BlazeDS将一个Spring bean暴露给了我的Flex应用程序。在我的Java代码中,我返回强类型列表。例如

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





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

  package myproject.vo {
import com.adobe.cairngorm。 vo.IValueObject;
导入mx.collections.ArrayCollection;

[Bindable]
[RemoteClass(alias =myproject.vo.Folder)]
public class Folder extends PersistentObject implements IValueObject {
public function Folder() {}


$ / code>

我检查了getters / setters我的Java文件夹类,以匹配我的Flex文件夹类中的属性。任何想法?

解决方案

我终于解决了这个问题后,一些谷歌搜索。这里是我发现的Flex远程处理规则:


  1. 注释Flex值对象以指示与其相关的Java类。如果包名称不同,这一点很重要。 - 例如[bindable] [b] [b] [b] [b] [b] [li]

  2. 构造函数必须在Flex和Java值对象中匹配。我最终坚持使用公有的无参数构造函数来保持简单。 最后一条规则是一个破解者 - 你必须实例化任何你需要反序列化的类。表面上看,这不应该是一个问题,但我花了几天试图反序列化远程getObjectsAtPath()调用的结果 - 一个包含文件夹和文档(都是PersistentObject的子类)实例的PersistentObjects的列表。如果你没有明确地实例化这个类(在我的情况下是Folder类),它不会被包含在SWF文件中(与Java不同)!我最终创建了一个类型为Folder的虚拟变量来解决这个问题。


    感谢大家的建议。 p>

    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);
    }
    

    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() {}
        }
    }
    

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

    解决方案

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

    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 {}

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

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

    4. 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.

    Thanks to everyone for your suggestions.

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

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