今回は、その逆の方向ということで、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 件のコメント:
コメントを投稿