2009-11-18 6 views
6

He expuesto un Spring Bean a mi aplicación Flex a través de BlazeDS. En mi código Java devuelvo listas fuertemente tipadas. p.ej.¿Cómo consigo una colección fuertemente tipada de BlazeDS?

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

La aplicación Flex recibe los datos como un ArrayCollection de instancias de objeto AS3 - es decir, no como un ArrayCollection de carpetas que es lo que quiera. He anotada mi clase Flex de la siguiente manera:

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() {} 
    } 
} 

Comprobé que tenía getters/setters en mi clase de carpeta de Java para que coincida con las propiedades de mi clase Flex carpeta. ¿Algunas ideas?

+0

He formateado su código para que los genéricos no sean tratados como HTML. –

Respuesta

11

Finalmente resolví este problema siguiendo un poco de Google. Estas son las reglas de la flexión de la comunicación remota que he encontrado:

  1. Anotar el valor del objeto de la flexión para indicar la clase de Java que se relaciona. Esto es esencial si el nombre del paquete es diferente. - p.ej. [Bindable] [RemoteClass (alias = "package.JavaClass")] public class FlexClass {}

  2. Los constructores DEBEN coincidir en objetos de valor de Flex y Java. Terminé apegándome a los constructores públicos no-args solo para mantenerlo simple.

  3. Getters y setters DEBEN hacer coincidir los objetos de valor de Flex y Java.

  4. La última regla es un cracker: DEBE instanciar cualquier clase que necesite deserializar. A primera vista, esto no debería ser un problema, sin embargo, pasé días tratando de deserializar los resultados de una llamada remota de getObjectsAtPath() - una lista de PersistentObjects que contenía instancias de carpeta y documento (ambas son subclases de PersistentObject). Si no se crea una instancia explícita de la clase (en mi caso, la clase Folder) NO se incluye en el archivo SWF (a diferencia de Java). Eventualmente creo una variable ficticia de tipo Carpeta para evitar esto.

Gracias a todos por sus sugerencias.

+0

No puedo enfatizar suficientemente el # 4. Si desea pasar un ArrayCollection de Foo's de Flex-> Java, debe hacer algo en la línea de arrayCollection.addItem (obj como Foo); –

+0

En lo que respecta al n. ° 4, puede engañar al compilador para que crea que está creando instancias de los objetos ficticios colocándolos en un bloque "if (0) {...}". No intente "if (false) {...}", parece que el compilador es lo suficientemente inteligente como para darse cuenta de que el código nunca se ejecuta. – Rydell

+0

Usted señor, está en lo correcto. No puedo comenzar a adivinar cuántas horas me salvaste. ¿Puedes compartir el enlace donde encontraste el número 4? – Stephano

0

estoy mirando a todos los de mi código del lado del servidor, y no puedo recordar si esto era necesario o no, pero en el lado de Java, que declarar los valores de retorno listas como inflexible de tipos:

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

yo también - parece que mis soportes en ángulo fueron eliminados. – ukdavo

+0

Los corchetes angulares, también conocidos como Generics, se eliminan en tiempo de compilación. –

+0

Quise decir quitado por el editor de texto StackOverflow. O eso o lo omití al escribir la pregunta. Siempre uso genéricos para escribir listas en Java. – ukdavo

0

Los genéricos de Java se eliminan en tiempo de compilación. La JVM no escribe colecciones en tiempo de ejecución. De todos modos, no veo el código de llamada, pero debe poner el valor de regresar de java en una variable que se declara algo como esto:

folders:ArrayCollection.<String> 
0

Usted mencionado que su clase de carpetas es compleja; ¿significa que contiene referencias a otros objetos? En este caso, ¿no tiene que mapear todas las otras clases (y verificar los setters/getters, especialmente para boolean)?

+0

sí, he estado haciendo eso. volveré a revisar. Gracias. – ukdavo

Cuestiones relacionadas