これまでのあらすじ
Wicket7で作った小規模なアプリケーションをためしにWicket8にマイグレーションしてみました。
エラーや警告を消して、とりあえず動くところまでで書き換えた内容を羅列する遊び。今更感が半端ないです。あとLambdaは扱いません。
これはなんちゃって備忘録みたいなナニカです。ちゃんとマイグレーションするなら本家の移行ガイド見るのが確実です。
AjaxButton.onSubmit() の第二引数
いままで引数として渡されていたFormがなくなってます。
私のコードでは参照してなかったので引数消すだけ。
必要なら AjaxButton.getForm()
で取得できるようになってます。
※AjaxLink.onClick()
、AjaxFallbackButton.onSubmit()
も同様の変更がなされているとのこと。
AjaxEventBehavior(とそのサブクラス)に指定するイベント名
たとえば AjaxFormComponentUpdatingBehavior
とか。
// いままで"onchange"とか指定しても動いてたけど・・・
hoge.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
// なんか処理
}
});
on
ついたままでも例外とかは出ないのだけれど、JavaScriptが動作しません。
Wicket 6.x の時点からログに「on 書くなよボケ。今は許すけど8からは許さん」って警告ログが出てたらしい。気づかんかった。
どうでもいいけど AjaxFormComponentUpdatingBehavior
ってクラス名は長すぎると思う。
AbstractReadOnlyModel 非推奨
使うなバッテン。IDEだと打ち消し線ひかれてダメ感倍増。
修正は簡単で、単に IModel
に置き換えればおっけい。
私は以下みたいなラベルを介して使っていたので、変更するのは一箇所だけですみました。
AbstractReadOnlyModel
って文字数多いから何度も書きたくなかっただけです。
package yamane.wicket;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
public abstract class ReadOnlyLabel<T> extends Label {
public ReadOnlyLabel(String id) {
super(id);
// ここをIModelに書き換えた
// setDefaultModel(new AbstractReadOnlyModel<T>() {
setDefaultModel(new IModel<T>() {
@Override
public T getObject() {
return load();
}
});
}
protected abstract T load();
}
Java8必須にしてインターフェイスのデフォルトメソッドが使えるようになったからやね。
とてもスッキリ。
AbstractRequestCycleListener 非推奨
これもだいたい AbstractReadOnlyModel
と同じ感じ。
extends
を implements
にしてデフォルトメソッドが追加された IRequestCycleListener
に置き換えます。
でもこれ移行ガイドに記述がなかったのですよね。エラーページ書き出す前のハンドリングとかで私はよく使っているのだけれど、みんな使ってないのかな。
Component.onConfigure() メソッド
オーバーライド時に super.onConfigure()
が必須になりました。
いままで Component.onConfigure()
の実装は空っぽだったから「呼び出す必要ないじゃんね一行記述が減るし」って思ってたのだけれど、Wicket8 からは「ダメ、例外、お前は死ぬ」っていわれます。
えっ? 前からJavaDocに必須って書いてあったじゃんですって?
ゴメンナサイ読んでませんでした。
頻繁にオーバーライドするメソッドなので、変更箇所もたくさん。Grepしてコピペするだけだけど。私的にはこれが一番大きかったです。
ここまで
思っていたよりもずいぶんと少ない変更で済みました。
Wicketのアプリケーションはプログラマ各々コードがだいぶ違う風になるんじゃないかなと個人的には思っています。どれが正しい間違いってのではなく、個性というか癖というか。
というわけで、違う人が作ったWicket7のアプリケーションではきっと違う書き換え場所が出てくるんじゃないかと思います。自分以外が作ったWicketアプリケーションのコードってあまり見たことがないので、確証はないですが。
と、この記事の役立たなさをアピールした後に唐突におわる。