2009-04-16 8 views
4

Ich verwende BlazeDS, um Flex mit Java zu verbinden. Ich habe Probleme beim Übergeben von ArrayLists von benutzerdefinierten Objekten von Flex an Java.BlazeDS und ArrayList von benutzerdefinierten Objekten

Ich habe zwei Objekte, eines heißt Kategorie, das andere Abschnitt. Eine Kategorie hat eine ArrayList von Section-Objekten. Ich kann eine ArrayList von Category Objekten zwischen Flex und Java hin und her senden, das Problem ist, wenn ich versuche, auf die Abschnitte ArrayList eines Category Objekts zuzugreifen, das von Flex an Java zurückgegeben wurde, bekomme ich folgende Fehlermeldung:

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

Aus irgendeinem Grund bekomme ich eine ArrayList von ASObjects statt meine Section-Objekte. Ich habe versucht, nachzusehen, wie man Arrays in ActionScript explizit eingibt, aber das einzige, was ich finden konnte, war ein Vector-Objekt, das BlazeDS nicht unterstützt. Ist es möglich, eine ArrayList von Section-Objekten innerhalb einer ArrayList von Category-Objekten zu übergeben, oder muss ich einen anderen Weg finden?

Antwort

4

Flex wurde tatsächlich ein flex.messaging.io.ArrayCollection Objekt zurückschicken. Unten ist der Code, dies zu einer Arraylist meiner Java-Klasse zu konvertieren:

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; 
    } 
+0

wirklich gutes Beispiel .. –

4

Eine der häufigsten Beschwerden mit AS3 ist das Fehlen von typisierten Arrays. ArrayLists enthalten nur Objekte, Sie müssen die Ergebnisse selbst generieren.

Hier ist ein Beispiel für eine Java und AS3-Klasse, die ich weitergeben würde.

In Java:

Die Top-Level-Klasse:

package mystuff; 

public class StuffToSend 
{ 
    public List<Section> sections; 
    ... 
} 

Sections Klasse:

package mystuff; 

public class Section 
{ 
    public List<Catagory> categories; 
    ... 
} 

Kategorie Klasse:

package mystuff; 

public class Category 
{ 
    ... 
} 

In 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 
    { 
     ... 
    } 
} 

Sie können mehr über Remoteobject erfahren hier: Data Access

+0

Würde ich es auf der AS-Seite oder Java-Seite werfen? Kannst du mich auf irgendwelche Beispiele hinweisen? – KevMo

+0

Danke für das Beispiel. So sieht mein Code aus, das Problem tritt auf, wenn ich die ArrayList von Category-Objekten von Java an Actionscript und dann an Java übergebe.Ich erhalte die Klassenausnahme-Ausnahme in der folgenden Codezeile in meinem Java: categories.get (1) .getSections(); – KevMo

+0

Können Sie die Variablendeklarationen bereitstellen? Ich kann nicht sagen, warum das einen Fehler verursachen würde, wenn Sie mir die Typen nicht zur Verfügung stellen. Vielleicht haben Sie die Generika nicht korrekt deklariert? – CookieOfFortune

0

die wirkliche Antwort ist, dass BlazeDS dumm ist, und das Bezugs aktiven Skriptobjekt erfordert Klasse zurück in Java zur Karte (auch wenn es nur erfolgreich genau dasselbe Objekt von Java nach AS gemappt). Ich habe heute ziemlich genau dasselbe Problem verschwendet. Ich hatte ziemlich viele ähnliche Mappings und sie haben alle gut funktioniert, aber heute habe ich ein neues erstellt, und es begann, mir eine Ausnahmegenehmigung zu geben.

eine Antwort finden Sie hier: Link

in Ihrem Fall Lösung wäre:

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

könnte es bessere Möglichkeiten, aber ich für heute genug.