Я выставил боб Spring своему приложению Flex через BlazeDS. В моем коде Java я возвращаю списки со строгим контролем типов. например.
public List<Folder> getFolders(String path) {
return dao.getFolders(path);
}
Приложение Flex получает данные как ArrayCollection Экземпляров объектов AS3 - т.е. не как ArrayCollection Папок, который является тем, что я хочу. Я аннотировал свой класс 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() {}
}
}
Я проверил, что у меня были методы считывания/методы set на моем классе Папки Java для соответствия свойствам в моем классе Папки Flex. Какие-либо идеи?
Я наконец решил эту проблему после небольшого поиска в Google. Вот правила удаленного взаимодействия Flex, которые я обнаружил:
Добавьте аннотацию к объекту значения Flex, чтобы указать класс Java, к которому он относится. Это важно, если имя пакета отличается. - например, [Bindable] [RemoteClass (alias = ”package.JavaClass”)] открытый класс FlexClass {}
Конструкторы ДОЛЖНЫ совпадать в объектах значений Flex и Java. В итоге я решил использовать общедоступные конструкторы без аргументов, чтобы не усложнять задачу.
Геттеры и сеттеры ДОЛЖНЫ соответствовать объектам значений Flex и Java.
Последнее правило - взломщик - вы ДОЛЖНЫ создавать экземпляры любых классов, которые вам нужны. десериализовать в. На первый взгляд, это не должно быть проблемой, однако я потратил дни, пытаясь десериализовать результаты удаленного вызова getObjectsAtPath () - список объектов PersistentObject, содержащих экземпляры Folder и Document (оба являются подклассами PersistentObject). Если вы явно не создаете экземпляр класса (в моем случае - класса Folder), он НЕ включается в SWF-файл (в отличие от Java)! В конце концов я создаю фиктивную переменную типа Folder, чтобы обойти это.
Спасибо всем за ваши предложения.
Дженерики Java удаляются во время компиляции. JVM не набирает коллекции во время выполнения. В любом случае, я не вижу вашего вызывающего кода, но он должен помещать возвращаемое значение из java в переменную, которая объявлена примерно так:
folders:ArrayCollection.<String>
Я просматриваю весь свой серверный код и могу ' Не помню, было ли это необходимо или нет, но на стороне Java я объявляю возвращаемые значения как строго типизированные списки:
public List<Folder> getFolders(String path) {
return dao.getFolders(path);
}
Вы упомянули, что ваш класс Folder сложен; означает ли это, что он содержит ссылки на другие объекты? В этом случае вам не нужно сопоставлять все остальные классы (и проверять сеттеры / геттеры, особенно для логических)?