5

Flex と Java を接続するために BlazeDS を使用しています。カスタム オブジェクトの ArrayLists を Flex から Java に渡すときに問題が発生しています。

2 つのオブジェクトがあり、1 つはカテゴリと呼ばれ、もう 1 つはセクションと呼ばれます。カテゴリには、セクション オブジェクトの ArrayList があります。Flex と Java の間で Category オブジェクトの ArrayList を送受信できます。問題は、Flex から Java に返された Category オブジェクトのセクション ArrayList にアクセスしようとすると、次のエラーが発生することです。

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

何らかの理由で、Section オブジェクトではなく ASObjects の ArrayList を取得しています。actionscript で配列を明示的に型指定する方法を調べてみましたが、BlazeDS がサポートしていない Vector オブジェクトを使用する方法しか見つかりませんでした。Category オブジェクトの ArrayList 内で Section オブジェクトの ArrayList を渡すことは可能ですか、それとも別の方法を見つける必要がありますか?

4

3 に答える 3

4

Flex は実際には flex.messaging.io.ArrayCollection オブジェクトを送り返していました。以下は、これを私の Java クラスの 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;
    }
于 2009-04-20T19:11:35.270 に答える
4

AS3 に関する最も一般的な不満の 1 つは、型付き配列がないことです。ArrayLists にはオブジェクトのみが含まれるため、結果を自分でキャストする必要があります。

これは、私が渡す Java および AS3 クラスの例です。

Java の場合:

最上位クラス:

package mystuff;

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

セクション クラス:

package mystuff;

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

カテゴリ クラス:

package mystuff;

public class Category
{
    ...
}

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

remoteObjects の詳細については、こちらをご覧ください:データ アクセス

于 2009-04-16T21:08:07.940 に答える
0

本当の答えは、BlazeDS はばかげており、アクティブなスクリプト オブジェクトを Java にマップするためにクラス参照が必要であるということです (Java から AS にまったく同じオブジェクトを正常にマップしたとしても)。今日、まったく同じ問題でかなりの時間を無駄にしました。かなりの数の同様のマッピングがあり、それらはすべて正常に機能しましたが、今日、新しいマッピングを作成したところ、クラス キャスト例外が発生し始めました。

ここで答えを見つけました:リンク

あなたの場合、解決策は次のようになります。

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

もっと良い選択肢があるかもしれませんが、今日は十分でした。

于 2011-06-07T15:11:25.287 に答える