GAEメモ
GAE/JでWicketを使ってたらJDOで取得したオブジェクトの値をもってるページがNotSerializableExceptionが発生してPage Expiredになることがあった。ページのメンバに格納しなくてもこの事象が発生する。
環境は。GAE SDK 1.2.5、Wicket 1.4.1
ローカルではPage Expiredにはならないが、本番にデプロイすると発生する。
Wicketはページ表示後にページの状態を保存するため、onDetachでページオブジェクトをシリアライズする。その際に、JDOでQuery#execute()で取得したListをListViewとかで使用しているとシリアライズできなくて発生する。
@PersistenceCapableなオブジェクト自体はSerialize可能。Query#execute()の結果はListを実装したorg.datanucleus.store.appengine.query.StreamingQueryResultが返されるが、これがSerialize不可。detachCopyAllしても不可。
取得したクエリ結果をArrayListなどSerializableなList実装につめなおせばOK。
NotSerializableExceptionが発生するかどうかはappengine上でWicketを使う際のポイントに記載されている通り、onDetachをオーバーライドして、ObjectOutputStreamとかでシリアライズを試してみればよい。onDetachをオーバーライドしたときは親クラスのonDetachを呼ぶこと。
0 件のコメント:
コメントを投稿