2010年4月21日水曜日

作業メモ:FlexのRemotingでjavaからにActionScript型をマッピングする方法

前回は、Flex の Remoting で ActionScript から java に型をマッピングする方法について、実際に動作を確認しながら考えてみました。

今回は、その逆の方向ということで、java から ActionScript に型をマッピングする方法について、実際に動作を確認しながら考えてみます。

基本的な事項は作業メモ:FlexのRemotingでActionScriptからjavaに型をマッピングする方法参照のこと。


Private Fields in Java to Public Fields in ActionScript

基本的に動くようです。

以下、JavaBeans規約を勘違いしてやらかした例。(´・ω・`)

前回 services-config.xml ファイルのチャネルの serialization の設定として include-read-only オプションを追加したのですが、うまく動作しないようです。

シリアライズ対象の Java のクラスは以下のフィールドを持っていて、すべてのフィールドは getter を持っています。
private long id;
private String eText;
private PartOfSpeech partOfSpeech;
private String jText;

仕様どおりなら、public な getter があるので正しく動作するはずです。実装的にも Bean の introspection を利用し判断しているのであれば、問題なく動作するはずなのですが、、、。

しかも、気持ち悪いことに、id だけは正しく伝わっていました。

試しに Java 側の private フィールドを public に変更してみたところ、ActionScript 側にデータが正しく伝わりました。

ということで、原因を調査してみることにしました。

結論。JavaBeans規約的に、おいらが間違ってました。
(´・ω・`) 先頭の2文字が大文字の場合、プロパティ名の先頭は小文字に変換されないのです。

JavaBeans API specification(1.01) の 8.8 Capitalization of inferred names にかかれています。
すっかり忘れてました。Sun出身なのにw


Enums in Java to Enum Like Objects in ActionScript

(´・ω・`) TypeError: Error #1034: 強制型変換に失敗しました。

おいらはいままでのところ、作業ログ:BlazeDSのRemotingServiceでJavaのenumを扱う方法で書いたような方法で Enum を扱っていました。そのため、Java 側から String として渡ってくる情報を ActionScript 上で Enum 的オブジェクトに変換しなければなりません。しかし、FlashPlayer 側に手を入れるわけにも行きません。

少し調べてみると、BLZ-17 に java の Enum と AS3 のクラスのマッピングができるようになっているという話を発見。

そちらに書かれている方法どおりにやってみたところ、問題なく動作しました。

初期化用の static ブロックは、web.xml の先頭で listener として読み込まれているという理由で、flex.messaging.HttpFlexSession クラスの先頭に追加しました。以下、追加されたソースです。
// patch for enum serialization
    static {
            PropertyProxyRegistry.getRegistry().register(Enum.class, new EnumProxy());
    }

0 件のコメント:

コメントを投稿