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-GuiceとWicket-Springのソースを読んでも全然意味が分からないので、どうしようかもう少し考える。