BlazeDS и ArrayList пользовательских объектов - PullRequest
4 голосов
/ 17 апреля 2009

Я использую BlazeDS для соединения Flex с Java. У меня возникают проблемы при передаче ArrayLists пользовательских объектов из Flex в Java.

У меня есть два объекта, один называется Категория, другой Раздел. Категория имеет ArrayList объектов Section. Я могу отправить ArrayList объектов Category между Flex и Java, проблема заключается в том, что при попытке получить доступ к разделам ArrayList объекта Category, который был возвращен в Java из Flex, я получаю следующую ошибку:

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

По какой-то причине я получаю ArrayList объектов ASObject, а не мои объекты Section. Я попытался найти способ явного ввода массивов в ActionScript, но единственное, что я смог найти, - это использовать объект Vector, который BlazeDS не поддерживает. Можно ли передать объекты ArrayList of Section в ArrayList объектов Category, или мне нужно найти другой путь?

Ответы [ 3 ]

4 голосов
/ 20 апреля 2009

Flex фактически отправлял обратно объект flex.messaging.io.ArrayCollection. Ниже приведен код для преобразования этого в ArrayList моего класса Java:

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;
    }
4 голосов
/ 17 апреля 2009

Одной из самых распространенных жалоб в 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
    {
        ...
    }
}  

Подробнее об удаленных объектах можно узнать здесь: Доступ к данным

0 голосов
/ 07 июня 2011

Реальный ответ таков: BlazeDS глуп и требует ссылки на класс для отображения вашего активного объекта сценария обратно в Java (даже если он только что успешно отобразил точно такой же объект из Java в AS). Я потратил довольно много времени на точно такую ​​же проблему сегодня. У меня было довольно много похожих сопоставлений, и все они работали нормально, но сегодня я создал новое, и оно стало давать мне исключение приведения класса.

нашел ответ здесь: Ссылка

в вашем случае решение будет:

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

Возможно, есть лучшие варианты, но мне хватит на сегодня.

...