2009/10/03

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 件のコメント: