自定义对象的BlazeDS和ArrayList

时间:2009-04-16 20:53:07

标签: java flex actionscript-3 blazeds

我正在使用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,或者我是否必须找到另一种方法?

3 个答案:

答案 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;
    ...
    }
}

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