BlazeDS和自定义对象的ArrayList

我正在使用BlazeDS将Flex与Java连接。 我无法将自定义对象的ArrayLists从Flex传递给java。

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

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

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

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

这是我将传递的Java和AS3类的示例。

在Java中:

顶级课程:

 package mystuff; public class StuffToSend { public List
sections; ... }

章节类:

 package mystuff; public class Section { public List 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的更多信息: 数据访问

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

 public ArrayList convertArrayCollection(ArrayCollection array){ ArrayList 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; } 

真正的答案是,BlazeDS是愚蠢的,并且需要类引用将您的活动脚本对象映射回Java(即使它只是成功地将相同的对象从Java映射到AS)。 我今天在同样的问题上浪费了相当多的时间。 我有很多类似的映射,它们都运行良好,但今天我创建了一个新的,它开始给我类抛出exception。

在这里找到答案: 链接

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

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

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