我正在使用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,或者我是否必须找到另一种方法?
答案 0 :(得分:4)
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
答案 1 :(得分:4)
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;
}
答案 2 :(得分:0)
真正的答案是,BlazeDS是愚蠢的,并且需要类引用将您的活动脚本对象映射回Java(即使它只是成功地将相同的对象从Java映射到AS)。我今天在同样的问题上浪费了相当多的时间。我有很多类似的映射,它们都运行良好,但今天我创建了一个新的,它开始给我类抛出异常。
在这里找到答案:Link
在你的案例解决方案中将是:
package mystuff
{
[RemoteClass(alias="mystuff.Section")]
public class Section
{
private var stupidBlazeDs : Category;
public var categories:ArrayCollection;
...
}
}
可能有更好的选择,但今天我已经足够了。