2012年3月12日月曜日

自社用業務システムを簡単に作ってみる AIR+BlazeDS+Spring その6

enumにトラブル発生。
これまでのプログラムで、Java+BlazeDS → AIR(Flex) の場合は、enumからテキストに変換さていましたが、AIR側からのテキストは、Javaでうまくenumとして受け取ってくれません。

ちょっと古いですが、こちらによると、
http://flexblog.faratasystems.com/2007/09/16/adding-enum-support-to-flex-amf-protocol
もともと、AMF(BlazeDSで使う通信フォーマット)は、Java1.4に対応して作られており、1.5で追加されたenumには対応していないとのこと。
このページでは、LCSD(有料版BlazeDSのようなもの)での解決策は記されていますが、BlazeDSとは別物のようでそのまま利用はできないようです。

そこで、オープンソースのwrenched http://code.google.com/p/wrenched/ というものをみつけて利用してみようとしましたが、正直使い方があまり良くわかりませんでした。

どうしようかと思っていたところ、このページにたどり着きようやく解決しました。
https://bugs.adobe.com/jira/browse/BLZ-17

単純な話、ActtionScript でもきちんと書けば enum のようになるということですな。

JobStatus.as
 [RemoteClass(alias=“jp.co.bzc.biz.xxxx.model.JobStatus”)]
 public class JobStatus
 {
  public static const 未着手:JobStatus = new JobStatus("未着手");
  public static const 着手:JobStatus = new JobStatus("着手");
  public static const 完了:JobStatus = new JobStatus("完了");
  
  public var val:String;
  public function JobStatus(v:String="unset"){
   val = v;
  }
  public function equals(other:JobStatus):Boolean{
   return other.val == val;
  }
   
  public function toString():String{
   return val;
  }
  
  public static function getAll():ArrayCollection{
   return new ArrayCollection([未着手,着手,完了]);
  }
 }


UserService.java に下記を加えます。
   static {
        PropertyProxyRegistry.getRegistry().register(Enum.class, new EnumProxy());
   } 

EnumProxyは、上記adobeのバグサイトに載っているものを使用しました。

これで、enumが使えるようになりました。
気持ちのよいプログラミングができそうです。

現在の課題は、JDOを使ったオブジェクトのアップデート(更新)です。
db4oのときもそうでしたが、同じIDを持っている別オブジェクトで「簡単に更新」するためにはどうすればいいのかが課題です。
atached detached などJDOの基本をやってみます。

0 件のコメント:

コメントを投稿