s2wicketとかブラウザバックとか
Not serializable exception や injectDependencyのエラー や ClassCastExceptionが出て数日ハマった…。
最終的には以下のパッケージ構成と設定でやることになりそう。
com.example.app | +- service +- entity +- wicket +- session +- page
- NamingConventionImplのaddRootPackageNameで com.example.app を指定
- S2WicketFilterのreloadingClassPatternに com.example.wicket.**,-com.example.com.wicket.session.** を設定
セッション関連のクラスからserviceパッケージのクラスを使う場合にクラスローダーを一致させておく必要がある。セッションはReloadingWicketFilterから外しているので、serviceパッケージもreloadingClassPatternに指定できない。
WicketCreatorを使うのでseasarのrootpackage以下にwicketのパッケージを置く必要がある。reloadingClassPatternで全体を指定するとWicketとSeasarがコンポーネント生成でぶつかるのでダメっぽい。
wicket-guiceのコードやs2wicketのコードを色々見たりいじったりしてしたが理想通りにはできず。
serviceなどのseasar用クラスを変更してもリロードされないとか、ここに書いてあるようにWicketObjectStreamFactoryを使ってもリロード後にステートフルなページでブラウザバックが効かない。が、例外は出ないので妥協しよう。
Enumをセッションに保持する場合はIObjectStreamFactory.DefaultObjectStreamFactoryを使う。Wicketのデフォルトではcan't deserialize enumと言われてenumをデシリアライズできなかった。この場合もブラウザバックが効かないが、deploymentモードならちゃんと効くのでこれも妥協点かな…。
あと凡ミスなのだが、seasar管理のコンポーネントをWebPageで使うときにtransientを書いてはいけない。
サービスクラスなどもs2wicketがプロキシを生成するのできちんとセッションに格納される。