2009-04-16 7 views
4

BlazeDS를 사용하여 Flex와 Java를 연결합니다. Flex에서 Java로 사용자 정의 객체의 ArrayList를 전달하는 데 문제가 있습니다.사용자 정의 오브젝트의 BlazeDS 및 ArrayList

두 개의 객체가 있는데, 하나는 Category라고하고 다른 하나는 Section입니다. Category에는 Section 객체의 ArrayList가 있습니다. Category 객체의 ArrayList를 Flex와 Java간에주고받을 수 있습니다. 문제는 Flex에서 Java로 반환 된 Category 객체의 ArrayList 섹션에 액세스하려고하면 다음 오류가 발생합니다.

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

어떤 이유로 나는 Section 객체가 아닌 ASObject의 ArrayList를 얻고 있습니다. 명시 적으로 actionscript에 배열을 입력하는 방법을 찾으려고했지만 BlazeDS가 지원하지 않는 Vector 객체를 사용하고있었습니다. Category 객체의 ArrayList 내에 Section 객체의 ArrayList를 전달할 수 있습니까? 아니면 다른 방법을 사용해야합니까?

답변

4

플렉스 실제로 flex.messaging.io.ArrayCollection 개체를 다시 전송했다. 다음은 내 자바 클래스의 ArrayList를이 변환하는 코드는 다음과 같습니다

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

정말 좋은 예입니다. –

4

AS3의 가장 일반적인 불만 중 하나는 입력 된 배열이 없다는 것입니다. ArrayList에는 객체 만 포함되므로 결과를 직접 캐스팅해야합니다.

다음은 Java 및 AS3 클래스의 예제입니다.

자바에서

:

최상위 클래스 :

package mystuff; 

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

섹션 클래스 :

package mystuff; 

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

Category 클래스 : AS3에서

package mystuff; 

public class Category 
{ 
    ... 
} 

:

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

현재 remoteObjects에 대해 자세히 알아볼 수 있습니다 : Data Access

+0

AS 측 또는 Java 측에서 전송할 예정입니까? 어떤 예를 들어 설명해 주시겠습니까? – KevMo

+0

예를 들어 주셔서 감사합니다. 그게 내 코드를 어떻게 생겼는지, 문제가 발생하면 클래스 개체의 ArrayList를 Java에서 actionscript로 전달한 다음 Java로 다시 전달합니다.내 Java에서 다음 코드 줄에 클래스 캐스트 예외가 발생합니다. categories.get (1) .getSections(); – KevMo

+0

변수 선언을 제공 할 수 있습니까? 왜 당신이 나에게 타입을 제공하지 않으면 그것이 에러를 일으키는 지 말할 수 없다. 제네릭을 제대로 신고하지 않았을 수 있습니까? – CookieOfFortune

0

진짜 대답은 블레이즈 DS 바보이고, (자바로 다시 액티브 스크립트 객체를 매핑 할 클래스 참조가 필요하다는이며, 심지어 경우 단지 Java에서 AS로 정확히 동일한 오브젝트를 맵핑 함). 나는 오늘날 정확히 같은 문제에 대해 꽤 많은 시간을 낭비했다. 나는 비슷한 매핑을 꽤 많이 가지고 있었고 그것들은 모두 잘 동작했지만 오늘은 새로운 클래스를 만들었고 클래스 캐스팅 예외를주기 시작했습니다.

여기에 해답을 발견 : 귀하의 경우 솔루션에 Link

은 다음과 같습니다

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

더 나은 옵션이있을 수 있습니다하지만 오늘은 충분했다.