【问题标题】:BlazeDS and ArrayList of custom objects自定义对象的 BlazeDS 和 ArrayList
【发布时间】:2010-10-19 23:17:18
【问题描述】:

我正在使用 BlazeDS 将 Flex 与 Java 连接起来。我在将自定义对象的 ArrayLists 从 Flex 传递到 java 时遇到问题。

我有两个对象,一个叫Category,另一个叫Section。 Category 具有 Section 对象的 ArrayList。我可以在 Flex 和 Java 之间来回发送 Category 对象的 ArrayList,问题是当我尝试访问从 Flex 返回到 Java 的 Category 对象的部分 ArrayList 时,我收到以下错误:

flex.messaging.MessageException: java.lang.ClassCastException : flex.messaging.io.amf.ASObject

由于某种原因,我得到了一个 ASObjects 的 ArrayList 而不是我的 Section 对象。我尝试查找如何在 actionscript 中显式键入数组,但我唯一能找到的是使用 BlazeDS 不支持的 Vector 对象。是否可以在 Category 对象的 ArrayList 中传递 Section 对象的 ArrayList,还是我必须找到另一种方法?

【问题讨论】:

    标签: java apache-flex actionscript-3 blazeds


    【解决方案1】:

    真正的答案是,BlazeDS 很愚蠢,需要类引用才能将活动脚本对象映射回 Java(即使它只是成功地将完全相同的对象从 Java 映射到 AS)。我今天在完全相同的问题上浪费了很多时间。我有很多类似的映射,它们都工作得很好,但是今天我创建了一个新的,它开始给我类转换异常。

    在这里找到答案:Link

    在您的情况下,解决方案是:

    package mystuff
    {
        [RemoteClass(alias="mystuff.Section")] 
        public class Section
        {
            private var stupidBlazeDs : Category;
            public var categories:ArrayCollection;
        ...
        }
    }
    

    可能有更好的选择,但我今天已经受够了。

    【讨论】:

      【解决方案2】:

      Flex 实际上是在发回一个 flex.messaging.io.ArrayCollection 对象。下面是将其转换为我的 java 类的 ArrayList 的代码:

      public ArrayList<MyObject> convertArrayCollection(ArrayCollection array){
              ArrayList<MyObject> myObjectArray = new ArrayList();
              ASTranslator ast = new ASTranslator();
              MyObject myObject;
              ASObject aso;
      
              for (int i=0;i< array.size(); i++){
                  myObject = new MyObject();
                  aso = new ASObject();
      
                  aso = (ASObject) array.get(i);
                  aso.setType("com.myPackage.MyObject");
                  myObject = (MyObject) ast.convert(aso, MyObject.class);
                  myObjectArray.add(myObject);
              }
              return myObjectArray;
          }
      

      【讨论】:

        【解决方案3】:

        对 AS3 最常见的抱怨之一是缺少类型化数组。 ArrayLists 将只包含对象,您必须自己转换结果。

        这是一个 Java 和 AS3 类的示例,我将传递给它。

        在 Java 中:

        顶级类:

        package mystuff;
        
        public class StuffToSend
        {
            public List<Section> sections;
            ...
        }
        

        节类:

        package mystuff;
        
        public class Section
        {
            public List<Catagory> categories;
            ...
        }
        

        类别类:

        package mystuff;
        
        public class Category
        {
            ...
        }
        

        在 AS3 中:

        package mystuff
        {
            [RemoteClass(alias="mystuff.StuffToSend")] // So AS3 knows which Java class to map
            public class StuffToSend
            {
                public var sections:ArrayCollection;
                ...
            }
        }
        
        package mystuff 
        {
            [RemoteClass(alias="mystuff.Section")] // So AS3 knows which Java class to map
            public class Section 
            {
                public var categories:ArrayCollection;
                ...
            }
        }
        
        package mystuff 
        {
            [RemoteClass(alias="mystuff.Category")] // So AS3 knows which Java class to map
            public class Category
            {
                ...
            }
        }  
        

        您可以在此处了解有关 remoteObjects 的更多信息:Data Access

        【讨论】:

        • 我应该将它投射到 AS 端还是 java 端?你能指出任何例子的方向吗?
        • 感谢您的示例。这就是我的代码的样子,当我将 Category 对象的 ArrayList 从 java 传递给 actionscript,然后再传回 java 时,就会出现问题。我在我的 java 中的以下代码行中得到类转换异常:categories.get(1).getSections();
        • 你能提供变量声明吗?如果您不向我提供类型,我不知道为什么会导致错误。也许您没有正确声明泛型?
        • 这是我在 AS3 中的 Category 类: package my.package { import mx.collections.ArrayCollection; [可绑定] [RemoteClass(alias="my.package.Category")] public class Category { public function Category() { } ... public var section:ArrayCollection; } } 和部分: package my.package { import mx.collections.ArrayCollection; [可绑定] [RemoteClass(alias="my.package.Section")] public class Section { public function Section() { } ... public var sectionName:String; } }
        • 这是我的 java 类: public class Category implements Serializable { ... private ArrayList
          section; } 公共类 Section 实现 Serializable { ... private String sectionName; }
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 2013-03-02
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        相关资源
        最近更新 更多