ログ日記

作業ログと日記とメモ

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で全体を指定するとWicketSeasarコンポーネント生成でぶつかるのでダメっぽい。


wicket-guiceのコードやs2wicketのコードを色々見たりいじったりしてしたが理想通りにはできず。


serviceなどのseasar用クラスを変更してもリロードされないとか、ここに書いてあるようにWicketObjectStreamFactoryを使ってもリロード後にステートフルなページでブラウザバックが効かない。が、例外は出ないので妥協しよう。
Enumをセッションに保持する場合はIObjectStreamFactory.DefaultObjectStreamFactoryを使う。Wicketのデフォルトではcan't deserialize enumと言われてenumをデシリアライズできなかった。この場合もブラウザバックが効かないが、deploymentモードならちゃんと効くのでこれも妥協点かな…。



あと凡ミスなのだが、seasar管理のコンポーネントをWebPageで使うときにtransientを書いてはいけない。
サービスクラスなどもs2wicketがプロキシを生成するのできちんとセッションに格納される。