Как получить строго типизированную коллекцию от BlazeDS? - PullRequest
6 голосов
/ 18 ноября 2009

Я выставил bean-компонент Spring для своего приложения Flex через BlazeDS. В моем коде Java я возвращаю строго типизированные списки. например,

public List<Folder> getFolders(String path) {
    return dao.getFolders(path);
}

Приложение Flex получает данные в виде ArrayCollection экземпляров объекта AS3, т. Е. Не в виде ArrayCollection of Folders, что мне и нужно. Я прокомментировал свой класс Flex следующим образом:

package myproject.vo {
    import com.adobe.cairngorm.vo.IValueObject;
    import mx.collections.ArrayCollection;

    [Bindable]
    [RemoteClass(alias="myproject.vo.Folder")]
    public class Folder extends PersistentObject implements IValueObject {
        public function Folder() {}
    }
}

Я проверил, что в моем классе Java Folder есть методы получения / установки, соответствующие свойствам моего класса Flex Folder. Есть идеи?

Ответы [ 4 ]

11 голосов
/ 19 ноября 2009

Я наконец решил эту проблему после небольшого поиска в Google. Вот правила Flex, которые я нашел:

  1. Аннотируйте объект значения Flex, чтобы указать класс Java, к которому он относится. Это важно, если имя пакета отличается. - например, [Bindable] [RemoteClass (псевдоним = ”package.JavaClass”)] открытый класс FlexClass {}

  2. Конструкторы ДОЛЖНЫ совпадать в объектах значений Flex и Java. Я остановился на общедоступных конструкторах без аргументов, просто чтобы все было просто.

  3. Методы получения и установки ДОЛЖНЫ совпадать между объектами значений Flex и Java.

  4. Последнее правило - это взломщик. Вы ДОЛЖНЫ создавать экземпляры любых классов, которые вам нужно десериализовать. На первый взгляд, это не должно быть проблемой, однако я потратил несколько дней, пытаясь десериализовать результаты удаленного вызова getObjectsAtPath () - списка PersistentObject, который содержит экземпляры Folder и Document (оба являются подклассами PersistentObject). Если вы явно не создаете экземпляр класса (в моем случае это класс Folder), он НЕ включается в SWF-файл (в отличие от Java)! В конце концов я создаю фиктивную переменную типа Folder, чтобы обойти это.

Спасибо всем за ваши предложения.

0 голосов
/ 19 ноября 2009

Обобщения Java удаляются во время компиляции. JVM не печатает коллекции во время выполнения. В любом случае, я не вижу ваш код вызова, но он должен помещать возвращаемое значение из Java в переменную, которая объявлена ​​примерно так:

folders:ArrayCollection.<String>
0 голосов
/ 19 ноября 2009

Вы упомянули, что ваш класс папок сложный; Означает ли это, что он содержит ссылки на другие объекты? В этом случае вам не нужно отображать все остальные классы (и проверять сеттеры / геттеры, особенно для логических значений)?

0 голосов
/ 18 ноября 2009

Я смотрю на весь свой серверный код и не могу вспомнить, было ли это необходимо или нет, но на стороне Java я объявляю возвращаемые значения как строго типизированные списки:

public List<Folder> getFolders(String path) { 
    return dao.getFolders(path); 
}
...