GAEのコーディング覚え書き

さっそくブログ放置し過ぎてました。。

今日は忘れないうちにslim3 on GAEでコーディングをしてて、個人的にハマったところなどを覚え書きー。
今回は初歩的なことかもですが、セッションでDTOを扱う際の注意点です。(slim3で書いてますがこれはGAEの仕様です)

セッションからDTOを取り出して中身を変更したら、もう一度セッションにDTOをセットし直さないと反映されない!


これは本番環境とローカル環境で挙動が違うのでハマった事象でした。  
例えば、

DTO

public class HogeDto implements Serializable {
    
    private String value;
    
    // 〜〜 アクセッサ省略

}

このDTOvalue値の変化を見るために、次の3ページの遷移をさせます。

  • 初期ページ … HogeDtoの生成とvalueに初期値をセットして、セッションにセット
  • 2ページ目 … セッションからHogeDtoを取り出してvalueの値を上書き
  • 3ページ目 … セッションからHogeDtoを取り出してvalueの値を出力

・初期ページのController

public class FirstController extends Controller {
    public Navigation run() {
        
        HogeDto dto = new HogeDto();
        dto.setValue("初期値です");
        sessionScope("dto", dto);
        
        return forward("first.jsp");
    }
}

・2ページ目のController

public class SecondController extends Controller {
    public Navigation run() {
        
        HogeDto dto = sessionScope("dto");
        dto.setValue("2ページ目でセットした値です");
        
        return forward("second.jsp");
    }
}

・3ページ目のController

public class ThirdController extends Controller {
    private static Logger log = Logger.getLogger(ThirdController.class);
    public Navigation run() {
        
        HogeDto dto = sessionScope("dto");
        log.info("HogeDtoのvalue値は … "+ dto.getValue());
        
        return forward("third.jsp");
    }
}

JSPは省略しますが、first→second→thirdの順に遷移すると・・


■開発環境の結果

「HogeDtoのvalue値は … 2ページ目でセットした値です」

■本番環境の結果

「HogeDtoのvalue値は … 初期値です」

となります。


本番環境では、DTOをセッションにセットした時にシリアライズされるようですね。
*厳密にはセットしたタイミングで”予約”のような動きをしてて、実際にシリアライズされるのはそのサーブレット処理が終わった後のようです。詳細後述。


結構作り込んだ後でこの問題に気づき、セッションでDTOを持ち回してる全ての箇所に”セット処理”を書くのは面倒だったので、

セッションから値を取り出したらすぐにセットし直す

という対応を親クラスに入れ込みました。

slim3なのでこんな感じ

public abstract class AbstractBaseController extends Controller {
    /**
     * GAE本番環境のSessionスコープオブジェクトは処理内でsetAttributeしておかないと
     * 変更が反映されない為、取得時にすぐセットしておく。
     */
    @Override
    protected <T>T sessionScope(CharSequence name) {
        T t = super.sessionScope(name);
        super.sessionScope(name, t);
        return t;
    }
}

このクラスを先程のfirst〜thirdのControllerに継承させることで、本番環境でも開発環境と同じ動作をするようになりました!


前述で”予約”のような動き、と言ったのは、このようにゲット→セットを一連でやっておけば、その後のDTOの値の変更がちゃんと反映される為です。
以上、セッションDTOの覚え書き。

チラ裏

はてなのブログ編集に慣れず、時間掛かるー・・・orz

CNMVちょこっと修正^^;

※CNMVの更新情報は以下のページに集約しました。(2010/1/4 追記)
http://code.google.com/p/kilvistyle/wiki/CNMV

こんばんわ。
昨日CNMVを公開して、おっかなびっくりついったーで呟いてみたら、いつも参考させてもらってる偉大な方々からRT頂いたりして一人で感激して悶え死にそうになってましたw
本当にありがとうございますありがとうございますm(__)m


僕の熱も冷めないウチに、早速気になってたイケテナイ点を少し修正してみました。

続きを読む

slim3用のModelViewer作ってみた

ここのところ、slim3を使ってGAEのアプリを作っています。
その過程で、マスタデータの初期設定やテストデータの投入をもっと簡単に行いたいなーということで、超シンプル低機能なViewerを作ってみました^^;

GAE標準のDatastore Viewerでは、特定の型のプロパティしか操作できなかったり閲覧できなかったり、何よりデータのダウンロード、アップロードができないので、その辺りを補完してみたつもりです。

せっかくなので公開してみようかと思います。。
(こういうこと初めてなので異様に緊張してますw)

CNMV(シーエヌ・モデルビューアー)

概要

slim3で作成したGoogleAppengine(以下GAEと記述)プロジェクト用のシンプルなデータビューアです。
GAEデフォルトのDataViewerよりも便利な機能を搭載しています。

主な機能

・基本的なプロパティ型の参照、更新
CSVファイルデータのダウンロード&アップロード


既存のslim3のプロジェクトにCNMVをパッケージすることで、簡単にプロジェクト内のモデルを使ったデータの操作を行うことができます。

詳しくは・・・

http://code.google.com/p/kilvistyle/wiki/CNMV
(更新履歴、使い方なども↑のGoogleCodeに移しました)


以下、簡単なイメージです。

その1.基本的なCRUD操作

*以下はslim3demoのBlogモデルを見てみた場合


その2.CSV形式のダウンロード&アップロード


その3.配列、コレクション型、Enum型などのサポート

という感じです。

CNMVデモページ

http://cnmv-demo.appspot.com/cn/modelview/
デモでは以下の4つのモデルが置いてあります。

demo.model.Hoge
demo.model.ArrayModel
demo.model.CollectionModel
demo.model.PrimitiveModel

新規追加、削除、ダウンロード、アップロードなど一通り試せるようになっています。

チラ裏

右下にさり気なくついったーのリンクとか張ってあります。フォローして欲しいぉ^^
不具合報告などはついったーか、こちらにコメント頂けると嬉しいです。

はてなダイアリー始めてみた

[雑談][appengine][slim3]

おはようございます。
初めましてkilvisと申します。

あまりブログとか日記を綴るようなのは長続きしない性格なので、
これまでブログとか(一部ゲーム用のを除く…w)は一切やっていませんでした。

ですが、ここへきて遅ればせながらちょっと始めてみようかと。


というのも、最近、仕事終わって家に帰ってくると slim3 でコーディングばかりやってます。
ついったーでつぶやき、助言もらいつつやってたりするのですが、やはり突っ込んだ内容になるとつぶやきじゃ難しいです^^;

slim3のMLに送るモノでもないけど、ついったーじゃ書き切れないコトをこっちに書いていこうと思います。
今後どこまで続くのかわからないけど、とりあえず始めてみましたー


今後ともヨロシクお願いします m(__)m