ログ日記

作業ログと日記とメモ

S2Wicket難しい

昨日はコンパイルが通って1ページ表示できるところまでやったが、どうもそれだけじゃ無理っぽい。


WebPageを継承したクラスを更に継承し、それをmountPage()で変えたURLにアクセスすると

Last cause: Parameter clazz must be an instance of com.mycompany.myapp.page.ChildPage,
 but is a com.mycompany.myapp.page.ParentPage

というエラーが出る。


というところまでは分かった…。
mountPageもうまく動かずリンクがパッケージ階層込みのアドレスになる。


あと1.4はSessionクラスをreloadingClassPatternで指定していても一応動いていたが、1.5だとドキュメント通り外さないといけないっぽい。



上のエラーメッセージは InheritedMarkupMarkupLoader.java

        private Markup getBaseMarkup(final MarkupContainer container, final Markup markup,
                final boolean enforceReload)
        {
                final Class<?> location = markup.getMarkupResourceStream().getMarkupClass().getSuperclass();

                // get the base markup
                return MarkupFactory.get().getMarkup(container, location, enforceReload);
        }

ここでスーパークラスを取得してMarkupCache.java

        public final Markup getMarkup(final MarkupContainer container, final Class<?> clazz,
                final boolean enforceReload)
        {
                Class<?> containerClass = clazz;
                if (clazz == null)
                {
                        containerClass = container.getClass();
                }
                else if (!clazz.isAssignableFrom(container.getClass()))
                {
                        throw new WicketRuntimeException("Parameter clazz must be an instance of " +
                                container.getClass().getName() + ", but is a " + clazz.getName());
                }

ここで例外。


containerとmarkupのクラスローダーが違うのかな?


今簡単なページで試したところだと、設定のreloadingClassPattern を消してWicketの監視対象から外したらエラーが出なくなってmountPageも正常に動いた。
この辺の処理がごっそり変わっているのかな。
https://cwiki.apache.org/WICKET/migration-to-wicket-15.html#MigrationtoWicket1.5-WicketIOCchanges
ここを読んでも何が変わったか分からない…。
Wicket-GuiceWicket-Springのソースを読んでも全然意味が分からないので、どうしようかもう少し考える。